Компилировать общую библиотеку статически - PullRequest
7 голосов
/ 11 мая 2010

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

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

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

Ответы [ 4 ]

5 голосов
/ 11 мая 2010

Общие объекты (.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
4 голосов
/ 11 мая 2010

Шаг 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
2 голосов
/ 11 мая 2010

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

1 голос
/ 11 мая 2010

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

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

...