Автоматическое обнаружение и связывание статической библиотеки - PullRequest
3 голосов
/ 14 октября 2010

У меня есть следующая проблема, которая, кажется, не имеет хорошего решения.

Например, у меня есть утилита CLI, которая использует libtiff и libX11. Я хочу создать две версии этой утилиты: динамически связанную и статически связанную (с максимально возможным количеством скомпилированных зависимостей).

Для динамического связывания все работает как чудо: нужно указать -ltiff -lX11, и компоновщик выдаст хороший исполняемый файл со ссылкой libtiff.so и libX11.so.

Ситуация ухудшается для статического связывания. Когда я использую следующую команду:

g++ -static-libgcc -Wl,-static -o my.out *.o -lc -ltiff -lX11

заканчивается на пропущенные символы в libtiff.a и libX11.a. Хорошо, я могу поместить все библиотеки, от которых они зависят, в строку:

g++ -static-libgcc -Wl,-static -o my.out *.o -lc -ltiff -ljpeg -lz -lX11 -lXau -lxcb -lXdmcp

но есть ли инструмент, который делает это открытие для меня? Может ли libtool помочь здесь (я вижу /usr/lib/libtiff.la, но не /usr/lib/libX11.la)? Может кто-нибудь привести базовый пример для libtool, пожалуйста? Ситуация критическая, если на какой-либо платформе libtiff предоставляет более узкие функциональные возможности и не ссылается на libjpeg, который вообще не будет доступен на этой платформе, поэтому приведенная выше команда для связывания не будет выполнена из-за неудовлетворительной зависимости библиотеки. 1022 *

Вторая проблема связана с этим предупреждением (я полагаю):

/usr/lib/libX11.a(xim_trans.o): In function `_XimXTransSocketUNIXConnect':
(.text+0xcda): warning: Using 'getaddrinfo' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking

Утилита не связана статически с libc, который все еще отображается в выводе ldd. Как правильно связать статически с libX11 и libc в этом случае?

Этот вопрос актуален, но я думаю, что переупаковка файлов .a файлов не очень хорошая идея.

Ответы [ 2 ]

3 голосов
/ 14 ноября 2010

Для библиотек, которые предоставляют .pc файлы для pkg-config, как это делают библиотеки X11R7:

% pkg-config --static --libs x11
-lX11 -lpthread -lxcb -lXau  

К сожалению, pkg-config --list-all, похоже, не показывает либифа как один из библиотеки, предоставляющие их, но вы можете, по крайней мере, превратить вашу команду ссылки в:

g++ -static-libgcc -Wl,-static -o my.out *.o -lc -ltiff -ljpeg -lz `pkg-config --static --libs x11`

и не нужно беспокоиться о том, чтобы отслеживать, какие библиотеки нужны для этой версии libX11 (поскольку до недавнего времени libxcb был необязательным, поэтому в старых дистрибутивах Linux его может не быть)

0 голосов
/ 03 октября 2012

В вашем случае статическое связывание glibc - плохая идея. Я рекомендую использовать смешанные ссылки.

...