С++: что делает #pragma comment (lib, "XXX" ) на самом деле с "XXX"?
Мой фон - С#, но я должен поддерживать некоторое наследие (MS) С++. В этой кодовой базе я перепутал:
#pragma comment(lib, "OtherLib700.lib")
где 700 - некоторое управление версиями. Кроме того, lib является DLL с тем же именем.
Сначала я подумал, что программа будет зависеть от DLL, но после ее удаления из системы программа все еще работает. Однако существует более новая версия DLL, которая называется OtherLib900...
Кажется, что программа "включила" код lib, чтобы он больше не зависел от внешней DLL. (Или что программа "автоматически" использует новую DLL...)
Какой из них правильный? Есть ли способ подтвердить это "предположение"?
Ответы
Ответ 1
Если программа имеет эту прагму, она будет искать библиотеку OtherLib700.lib
. Если это библиотека импорта при загрузке программы, окна будут искать OtherLib700.dll
в пути. Он не будет пытаться искать OtherLib900.dll
во время выполнения, поэтому он должен найти ваш dll
в другой папке. Предполагается, что OtherLib700.lib
- это библиотека импорта, а не статическая библиотека. Если OtherLib700 является статической библиотекой, то это все, что ему нужно.
Ответ 2
Этот pragma
используется для связи с указанным файлом .lib
. Это альтернатива заданию библиотеки во внешнем поле зависимостей в настройках проекта.
В основном, он использовался для поддержки разных версий:
#ifdef USE_FIRST_VERSION
#pragma comment(lib, "vers1.lib")
#else
#pragma comment(lib, "vers2.lib")
#endif
Когда ваше приложение использует динамически связанную библиотеку, файл lib
сообщает вам информацию о том, какие символы экспортируются в dll
. Поэтому в основном вам нужен только lib
для компиляции и ссылки, но вам нужно dll
запустить программу, так как она содержит весь двоичный код.
Вы говорите, что есть связанный dll
, который обычно указывает, что файл lib
содержит только ссылку на информацию и код. Вы должны получить ошибку во время выполнения, если связанный dll
не найден. Вы можете проверить с помощью MSVS, если была загружена другая версия dll
или если она была загружена из другого места.
Ответ 3
Если .lib - это "реальная" библиотека с фактическим кодом (я никогда не использовал библиотеки DLL для системных, но я считаю, что вы делаете "импортные библиотеки" для своих собственных DLL), а затем DLL не требуется.
Что касается субъекта, #pragma comment (lib, xxx) позволяет программам добавлять определенные опции для компоновщика. Может быть очень полезно, хотя я пропустил несколько вариантов, которые мне хотелось бы добавить так. Приведенный пример является ярким примером его использования: когда объектный файл включен в программу, тогда также будет добавлен указанный lib.