Как линкер узнает, что все библиотеки нужно связать? - PullRequest
9 голосов
/ 12 февраля 2012

С http://www.learncpp.com/cpp-tutorial/19-header-files/

enter image description here

Как компоновщик узнает, что ему нужно включить стандартную библиотеку времени выполнения, и, например, определения функций, объявленных в iostream, отсутствуют где-либо еще?

Существует ли какое-либо отображение, облегчающее процесс связывания?

Перефразируя - Если я включу какой-нибудь файл только с объявлениями функций, как какой-нибудь компоновщик выяснит, где находятся определения функций?

Ответы [ 2 ]

6 голосов
/ 12 февраля 2012

Это только одна из настроек по умолчанию для вашего компоновщика. Как правило, вы можете указать , а не , чтобы связать стандартные библиотеки, если вы не хотите их использовать.

И вы всегда должны явно указать компоновщику, чтобы он связывал любые дополнительные библиотеки, которые использует ваше приложение. Он не будет «выяснять», где определения функций основаны исключительно на включенных объявлениях.

5 голосов
/ 12 февраля 2012

Если вы используете g++, он будет всегда связывать стандартную библиотеку c ++ (-lstdc++).

Чтобы обойти это, вы можете использовать gcc и связать другую библиотеку.

Редактировать: компоновщик не определяет ничего . Стандартная библиотека автоматически связывается, поэтому для стандартных функций нечего выяснять. Если вы просто объявите что-то, чего нет в STL, и попытаетесь использовать это без фактического определения, компоновщик потерпит неудачу. Вы должны вручную связать библиотеку / .o.

...