Скомпилируйте общую библиотеку статически

У меня есть общая библиотека с некоторыми самодельными функциями, которые я компилирую в свои другие программы, но я должен связать программу конца со всеми библиотеками, я раньше компилировал статическую библиотеку. Вот пример:

У меня есть функция foo в библиотеке, которая требует функции от другой библиотеки libbar.so.

В моей основной программе для использования функции foo Я должен скомпилировать его с -lbar флаг. Есть ли способ, которым я могу скомпилировать свою библиотеку статически, таким образом, это включает весь необходимый код из других библиотек, и я могу скомпилировать свою программу конца, не нуждаясь -lbar флаг?

8
задан BЈовић 1 March 2013 в 09:57
поделиться

4 ответа

Общие объекты (.so) - это не библиотеки, это объекты. Вы не можете извлечь их часть и вставить в другие библиотеки.

Что вы можете сделать, так это создать разделяемый объект, который ссылается на другой - но другой будет нужен во время выполнения. Просто добавьте -lbar при компоновке libfoo.

Если вы можете собрать libbar, вы можете создать библиотеку, которая будет комбинацией libfoo и libbar. IIRC, вы также можете заставить компоновщик собрать библиотеку, состоящую из libfoo и необходимой части libbar, соединив .a с .o, предназначенным для libbar. Пример:

gcc -fPIC -c lib1.c     # define foofn(), reference barfn1()
gcc -fPIC -c lib2a.c    # define barfn1(), reference barfn2()
gcc -fPIC -c lib2b.c    # define barfn2()
gcc -fPIC -c lib2c.c    # define barfn3()
gcc -c main.c           # reference foofn()
ar -cru libbar.a lib2*.o
gcc -shared -o libfoo.so lib1.o -L. -lbar
nm libfoo.so | grep barfn2()    # ok, not here
gcc -o prog main.o -L. -lfoo
env LD_LIBRARY_PATH=. ./prog    # works, so foofn(), barfn1() and barfn2() are found
5
ответ дан 5 December 2019 в 14:01
поделиться

Вы можете заставить такие вещи работать, используя libtool, см. руководство libtool по зависимостям библиотеки Inter для примера того, как это работает

2
ответ дан 5 December 2019 в 14:01
поделиться

В принципе, если у вас есть статически связанные библиотеки системных библиотек, от которых зависит ваша статическая библиотека, вы можете статически связать весь код из них .

Я не знаю почему. * Работа с разделяемыми библиотеками платформами NIX - гениальная работа, и она значительно сокращает размер скомпилированной программы. Если вы беспокоитесь о том, что не сможете запустить код на другом компьютере из-за отсутствия библиотек, то вы всегда можете пойти по пути большинства программ с закрытым исходным кодом, скомпилированных для библиотек Linux: просто скомпилируйте их с помощью -Wl, - -rpath -Wl ,. опций в GCC и распространять библиотеку вместе с двоичным файлом.

1
ответ дан 5 December 2019 в 14:01
поделиться

Шаг 1 (Создание объектного файла):

gcc -c your.c -o your.o

Шаг 2 (Создание статической библиотеки):

ar rcs libyour.a your.o

Шаг 3 (Ссылка на статическую библиотеку):

gcc -static main.c -L. -lyour -o statically_linked
4
ответ дан 5 December 2019 в 14:01
поделиться