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

Ctrl-C + Ctrl-V + комбинация Ctrl-X:)

15
задан Canopus 7 August 2009 в 04:02
поделиться

3 ответа

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

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

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

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

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

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

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

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

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

26
ответ дан 1 December 2019 в 01:38
поделиться

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

7
ответ дан 1 December 2019 в 01:38
поделиться

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

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

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

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

1
ответ дан 1 December 2019 в 01:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: