У меня есть следующая проблема, которая, кажется, не имеет хорошего решения.
Например, у меня есть утилита 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
файлов не очень хорошая идея.