Можно ли создать общую библиотеку со статической ссылкой, используемой библиотекой?
Я могу создать исполняемый файл с gcc со статической ссылкой:
gcc -static xxx.c -o xxx
Поэтому я могу запустить xxx без какой-либо внешней зависимой библиотеки.
Но что, если я хочу создать общую библиотеку без externel-зависимой библиотеки? я хочу сказать, что хочу
в общей библиотеке статически связана ее ссылка externel.
Ответы
Ответ 1
Это будет работать:
# Generate position independent code (PIC)
gcc -fPIC -c -o xxx.o xxx.c
# Build a shared object and link with static libraries
ld -shared -static -o xxx.so xxx.o
# Same thing but with static libc
ld -shared -static -o xxx.so xxx.o -lc
Прояснение: флаг -static, если он указан gcc, передается компоновщику (ld) и сообщает ему работать со статической версией (.a) библиотеки (указанной с -l-флагом) а не динамическую версию (.so).
Другое: в моей системе (Debian) последний пример дает libc.a... перекомпилировать с ошибкой -fPIC. Довольно уверен, что это означает, что libc.a, который у меня есть в моей системе, не был скомпилирован с -fPIC. Однако, поиск libc pic apt-cache показал некоторые результаты.
Смотрите также: Библиотека программ HOWTO, SO: объединение .so libs, ld (1), gcc (1)
Ответ 2
Там есть какой-то аккуратный хакер, который вы можете сделать с Rpath, чтобы исполняемый файл ELF или .so будет искать свои зависимые .so файлы сначала в тот же каталог, что и сам:
-
сделать короткий script echo-rpath, состоящий из
echo '-Wl, - rpath = $ORIGIN'
-
добавьте это в свою командную строку сборки как файл gcc -o -lwhatever `echo-rpath `
objects
(Механизм эха мешает Make или оболочке есть знак $и гарантирует, что он будет передан в ld.)
Ответ 3
Если у вас есть планы по переносимости для вашей общей библиотеки, используйте libtool(1)
. Он будет обрабатывать большую часть деталей флагов компилятора для вас и сделает вашу жизнь бесконечно легкой. Если вы не используете libtool
, но позже решите, что хотите перенести свою программу на OS X или Windows, вы все равно ее изобретете.