Может ли статическая библиотека C ++ связываться с общей библиотекой? - PullRequest
15 голосов
/ 07 августа 2009

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

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

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

Ответы [ 3 ]

26 голосов
/ 07 августа 2009

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

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

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

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

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

7 голосов
/ 07 августа 2009

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

1 голос
/ 07 августа 2009

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

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

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

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

...