Разве связи не достаточно связывают? - PullRequest
0 голосов
/ 09 июня 2010

На днях в Visual Studio (C ++) я пытался создать пример кода, и он не работал, хотя я указывал на правильные каталоги include и lib (у меня были ошибки компоновщика).

Я спросил друга, который исправил проблему, указав необходимые .lib-файлы в Общих свойствах-> Компоновщик-> Поле ввода настроек проекта.

Мои вопросы:

Разве недостаточно просто указать каталог с файлами .lib? Вам необходимо указать компоновщику, какие файлы lib нужно связать?

Перечисляя файлы .lib в поле additional dependencies, я точно указываю, какие статические библиотеки встроены в exe? Если ответ на это да, то это будут ТОЛЬКО файлы lib, которые будут встроены в исполняемый файл? Почему это называется additional зависимости? Есть ли другое место для указания файлов lib для включения? Раньше я думал, что это было сделано путем включения необходимого заголовочного файла.

Ответы [ 2 ]

2 голосов
/ 09 июня 2010

Включение заголовка в ваш исходный код делает объявления из этого заголовка доступными для компилятора. Если компилятор не может найти объявление для используемой вами библиотечной функции (константы, макроса и т. Д.), Он не может сгенерировать объектный код, который ссылается на эту функцию.

Как только компиляция завершится успешно, вы получите объектный код, содержащий несколько символов. Чтобы объектный код был полезен, эти символы на самом деле должны ссылаться на что-то. Вот тут и вступает компоновщик - он разрешает символы в только что скомпилированном коде в соответствующий объектный код в используемых вами двоичных библиотеках.

Итак, да, вам нужно указать компоновщику, какие файлы .lib связать - аналогично тому, как вы указали компилятору (посредством ваших директив #include), на какие заголовочные файлы обращаться. Если компоновщик не может разрешить символ, компоновка не удастся (я полагаю, это ошибка компоновщика, которую вы получили).

На самом деле я не использую Visual Studio, но согласно этой статье MSDN , VS по умолчанию ссылается на LIBC.LIB и целый ряд других библиотек. Если вы используете другую статическую библиотеку, которая по умолчанию не связана, это дополнительная зависимость.

0 голосов
/ 09 июня 2010

Это правильно, простое указание на каталог не приведет к тому, что библиотеки .libs в этом каталоге будут связаны (рассмотрим случай с папкой Visual Studio 'lib': в моей версии есть 60 файлов: представьте, если онивсе были связаны!)

Это называется "дополнительным", потому что обычно есть стандартная среда выполнения C ++, которая связывается автоматически.Различные #pragma могут вызывать автоматическое связывание библиотек (это делают такие библиотеки, как boost).

...