Может ли статическая библиотека С++ связываться с общей библиотекой?

Скажем, у меня есть статическая С++ lib, static.lib, и я хочу вызвать некоторые функции из общей библиотеки С++, например shared.lib. Возможно ли это?

Теперь предположим, что у меня есть другая общая библиотека lib, скажем, shared2.lib, которая ссылается на static.lib, но не ссылается на shared.lib. Ли линкер автоматически связывает shared2.lib с shared.lib в этом случае?

Я использую Microsoft Visual Studio 2003.

Ответы

Ответ 1

Статические библиотеки не связаны. Это всего лишь коллекция объектных файлов (*.obj или *.o), которые архивируются вместе в файл библиотеки (вроде файла tar/zip), чтобы облегчить компоновщику поиск необходимых символов.

Статический lib может вызывать функции, которые не определены (но объявлены только в файле заголовка), поскольку они только компилируются. Затем, когда вы связываете exe или dll, использующую статическую библиотеку lib, вам нужно будет связать ее с другой библиотекой, которая предоставляет вызов из статической библиотеки lib, но не определена в ней.

Если вы хотите, чтобы компоновщик автоматически связывал другие библиотеки, предложение Стивена будет работать и используется очень авторитетными библиотеками, такими как boost и stlport. Для этого поставьте прагму в основной файл заголовка для статической библиотеки. Вы должны включить статическую библиотеку и ее иждивенцев.

Однако IMO эта функция действительно предназначена для библиотек, где библиотека находится в пути к системной библиотеке, поэтому компоновщик легко ее найдет. Также в случае boost и stlport они используют эту функцию для поддержки нескольких версий одних и тех же библиотек с параметрами, определенными с помощью #define, где для разных параметров требуются разные версии связанной библиотеки. Это означает, что пользователи с меньшей вероятностью настраивают boost одним способом и связывают с другой конфигурацией библиотеки.

Мое предпочтение для кода приложения - явно связать необходимые части.

Ответ 2

Компонент не будет автоматически загружать другие библиотеки, но вы можете использовать # pragma comment (lib, "static.lib" ) для упростить процесс связывания дополнительных файлов, добавив прагму в ваши файлы заголовков.

Ответ 3

Скажем, у меня есть статический С++ lib, static.lib, и я хочу назвать некоторые функции из С++ shared lib, скажем, shared.lib. Возможно ли это?

Да, например, когда вы вызываете функции Windows из своей статической библиотеки, они обычно из какой-либо динамической библиотеки, поэтому не должно быть разницы.

Теперь предположим, что у меня есть другой общий lib, скажем shared2.lib, который ссылается на static.lib, но не ссылается на shared.lib. Ли линкер автоматически связывать shared2.lib с shared.lib в этом случае?

Если такие зависимости могут возникнуть позже, я бы предположил, что вместо этого вы динамически загружаете библиотеки, используя LoadLibrary(), таким образом вам не нужно отслеживать такие зависимости при компиляции/компоновке.