С++: что делает #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.