Связывание совместно используемой библиотеки с другим общим lib в linux - программирование
Подтвердить что ты не робот

Связывание совместно используемой библиотеки с другим общим 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++

4b9b3361

Ответ 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).