Статическая библиотека в зависимости от общей библиотеки - PullRequest
4 голосов
/ 30 августа 2010

Я создал коммуникационную библиотеку, которая статически связана с несколькими различными приложениями. Библиотека обеспечивает поддержку связи через различные виды оборудования. Некоторое оборудование поддерживается поставщиком через общую библиотеку. В системах без такого оборудования общая библиотека недоступна.

Ранее мы справились с этим, скомпилировав двойные версии библиотеки связи и приложений. Это, однако, не очень практично, поэтому я подумал об использовании более динамичной коммуникационной библиотеки, которая пытается загрузить библиотеку вендора с помощью dlopen () / dlsym (), если она доступна. Кажется, это хорошо работает. Но проблема в том, что каждый, кто использует мою библиотеку, должен будет указать опцию -ldl при связывании своего приложения с моей библиотекой. Даже если это небольшая неприятность, мне интересно, как это обычно решается.

Возможно ли каким-либо образом создать статическую библиотеку, которая будет автоматически (во время компиляции или во время выполнения) вносить необходимую разделяемую библиотеку?

Считается ли хорошей практикой разрешать статическим библиотекам зависеть от разделяемых библиотек?

РЕДАКТИРОВАТЬ: Я знаю, что libtool, вероятно, мог бы решить эту проблему, но это все равно изменило бы процесс сборки для всех приложений еще больше, чего я бы предпочел избежать.

РЕДАКТИРОВАТЬ 2: Целевые платформы в основном Linux и Solaris. Gcc в качестве компилятора.

1 Ответ

4 голосов
/ 30 августа 2010

Я не знаю о Solaris, поэтому предположим, что все в моем ответе здесь применимо только к Linux (хотя pkg-config также может использоваться на Solaris).

Во-первых, у статической библиотеки нет поддерживаемого способа получить зависимость от времени соединения. Сожалею. В большинстве библиотек для этого используется что-то вроде pkg-config , то есть при сборке вы добавляете в командную строку компилятора:

gcc `pkg-config --cflags your-library` [...]

и при ссылке:

gcc `pkg-config --libs your-library` [...]

Обратите внимание, что в этом случае параметр --libs будет выдавать что-то вроде -ldl -lyourlib в качестве вывода. Параметр --cflags может не выводить или может добавлять некоторые включаемые пути.

Если вам абсолютно необходимо, чтобы он работал только с -lyourlib, и вы не возражаете против привязки к неподдерживаемому и нестабильному интерфейсу в glibc ... Что ж, libdl - просто тонкая оболочка для некоторых подпрограмм в динамический компоновщик, через недокументированный vtable. Если вы посмотрите на источник в каталоге dlfcn/ используемой версии glibc, вы сможете скопировать то, что он делает.

ОДНАКО интерфейс между libdl и ld-linux является PRIVATE и UNSTABLE - он может измениться в любом выпуске glibc, включая второстепенные и исправленные. Делайте это ТОЛЬКО если вы контролируете развернутую версию glibc и готовы перестроить ваше приложение при необходимости. Также обратите внимание, что если ваша библиотека не является LGPL, то при использовании такого частного API могут возникнуть проблемы с лицензированием; не уверен, как обстоят дела с этим для LGPL.

...