Может ли статическая библиотека C ++ ссылаться на общую библиотеку?

StackOverflow https://stackoverflow.com/questions/1242820

Вопрос

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

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

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

Это было полезно?

Решение

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

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

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

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

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

Другие советы

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top