Подтвердить что ты не робот

Можно ли создать общую библиотеку со статической ссылкой, используемой библиотекой?

Я могу создать исполняемый файл с gcc со статической ссылкой:

gcc -static xxx.c -o xxx

Поэтому я могу запустить xxx без какой-либо внешней зависимой библиотеки.

Но что, если я хочу создать общую библиотеку без externel-зависимой библиотеки? я хочу сказать, что хочу в общей библиотеке статически связана ее ссылка externel.

4b9b3361

Ответ 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, вы все равно ее изобретете.