Связывание совместно используемой библиотеки с другим общим lib в linux
Я пытаюсь создать общую библиотеку. Скажем, libabc.so. Он использует другой .so файл, скажем lib123.so(lib в /usr/local/lib ). Теперь я использую свой общий lib libc.c.so в своем приложении. скажем, my-app.I хочу знать, как я должен связывать эти двоичные файлы? Я не хочу напрямую связывать мое приложение с lib123.so. my-app должен быть связан только с libabc.so. Как я могу это сделать?
Спасибо заранее. Я использую компилятор g++
Ответы
Ответ 1
Предположим, что libabc.so
получается из не зависящих от себя файлов объектных кодов abc1.pic.o
и abc2.pic.o
; то вы их построили, например,
gcc -Wall -fPIC -O -g abc1.c -c -o abc1.pic.o
gcc -Wall -fPIC -O -g abc2.c -c -o abc2.pic.o
и вы создаете libabc.so
с помощью
gcc -shared abc1.pic.o abc2.pic.o -L/usr/local/lib -l123 -o libabc.so
Я добавил -L/usr/local/lib
до -l123
, потому что предполагаю, что у вас есть библиотека /usr/local/lib/lib123.so
.
Прочитайте также Библиотека программы HowTo.
Как вы видите, вы можете связать общую библиотеку lib123.so
с вашей собственной общей библиотекой libabc.so
Затем установите флажок ldd libabc.so
PS. Не используйте статическую библиотеку для lib123.a
(это должен быть PIC). Если вы связываете не-PIC-код с общим объектом, вы теряете большинство преимуществ общих объектов, а динамический компоновщик ld.so должен выполнять zillions перемещений.
Ответ 2
При попытке создать свою собственную общую библиотеку, использующую Berkeley DB, я обнаружил, что мне нужно положить -ldb в конец команды gcc, иначе он взорвался, если бы не был найден символ db_create. Это было под Cygwin.
В частности, это сработало:
gcc -shared -o $b/$libfile nt _ *. o -ldb
Это не сработало:
gcc -ldb -shared -o $b/$libfile nt _ *. o
Ответ 3
Например, следуя той же процедуре, на которую указал Бэзил Старынкевич, у меня есть библиотека, которая зависит от libm.so
, поэтому компиляция для объектов библиотеки:
gcc -fPIC -Wall -g -I include -I src -c src/wavegen.c -o build/arm/wavegen.o
gcc -fPIC -Wall -g -I include -I src -c src/serial.c -o build/arm/serial.o
Однако для компиляции библиотеки в некоторых версиях gcc важен порядок размещения ссылок на библиотеки, поэтому я предлагаю обеспечить совместимость, поместив эти ссылки в конце команды:
gcc -shared -Wl,-soname,libserial.so.1 -o lib/libserial.so.1.0 build/arm/wavegen.o build/arm/serial.o -lm
Я проверил в ПК (gcc v.8.3.0) и в ARM (gcc v.4.6.3).