У меня есть проект foo
, который зависит от a
, который, в свою очередь, зависит от b
, в свою очередь зависит от c
. Мой скрипт сборки pull/configure
/make
- это три зависимости от источника в правильном порядке, и они компилируются в порядке.Статически связывайте несколько библиотек в один .so
Прямо сейчас, распространять foo.so
, мне также нужно распределить все его зависимости (a.so
, b.so
и c.so
) рядом. Я хочу построить foo.so
, содержащий все объекты как foo
, так и все его зависимости; таким образом я могу распространять одну библиотеку.
a
, b
и c
все используют Autotools и генерировать связанные * .o файлы в SRC/каталога, а также .libs/каталог, содержащий обычное поверхностное знание * .ar * .lo * .lai и * .so, все действительные. Сейчас я использую этот набор флагов GCC, чтобы построить мой foo.so
:
gcc -shared ./my/src/*.c \
-I./a/include -I./b/include -I./c/include \
-L ./a/.libs -L./b/.libs -L./c/.libs \
-la -lb -lc \
-o ./foo.so \
-w -fPIC -m64 \
-std=c99
(обратите внимание, что «-la -lb -lc» просто «-l» флаги для каждой зависимости, я не просто испортить флаги).
Использование readelf -d
на итоговой foo.so
действительно показывает, что оно имеет зависимость от a
. Учитывая, что у меня есть все файлы сборки для всех зависимостей, мне кажется, что я просто пропускаю некоторый флаг для «включить этот путь при поиске * .o файлов для ссылки».
Я пробовал разные вещи и, честно говоря, даже не могу вспомнить различные ошибки и условия, которые привели к ним. Наиболее перспективным является this question, но после удаления моих линий «-l» в пользу строк «-Wl, - whole-archive», я получаю эту ошибку (обратите внимание, что «aa» - это просто * .a для a
) :
/usr/bin/ld: ./a/.libs/a.a(bands.o): relocation R_X86_64_32S against `.rodata' can not be used when making a shared object; recompile with -fPIC
./a/.libs/a.a(bands.o): error adding symbols: Bad value
Который не имеет смысла для меня, так как эти файлы должны быть PIC для того, чтобы построить их в * .so, верно? Процесс сборки для этих зависимостей делает * .so.
Я на Mint Linux, если это имеет значение.
Если у вас есть '.la' файлов, используйте' libtool' для обрабатывать [ссылки] (http://www.gnu.org/software/libtool/manual/libtool.html#Linking-libraries) , например, 'libtool --mode = link gcc -o foo.la ./my/src/*.lo ./a/a.la ./b/b.la./c/c.la' - требуется источник объекты, которые должны быть построены с помощью 'libtool --mode = compile gcc -c file.c' –