Подтвердить что ты не робот

Как связать статическую библиотеку с динамической библиотекой в ​​gcc

В gcc (g++) я собрал статическую библиотеку .a (назовите ее some_static_lib.a). Я хочу связать (это правильная фраза?) Этот .a файл в другую динамическую библиотеку (назовите ее libsomeDyn.so), которую я создаю. Хотя компиляция .so, я не вижу содержание .a под .so с помощью команды nm:

/usr/bin/g++ -fPIC -g -O2 -Wall -Werror -pipe -march = pentium3 -mtune = prescott -MD -D_FILE_OFFSET_BITS = 64 -DLINUX -D_GNU_SOURCE -D_THREAD_SAFE -I../../../../../../../../-I../../../../../../../..//libraries -Wl, -rpath,/usr/lib -o libsomeDyn.so some.o another.o some_static_lib.a -shared -Wl -x -Wl, -soname, libsomeDyn.so

Я не вижу функции под some_static_lib.a под libsomeDyn.so. Что я делаю неправильно?

4b9b3361

Ответ 1

Статические библиотеки имеют специальные правила, когда дело доходит до ссылки. Объект из статической библиотеки будет добавлен только в двоичный файл, если объект предоставляет неразрешенный символ.

В Linux вы можете изменить это поведение с помощью опции --whole-archive linker:

g++ -Wl,--whole-archive some_static_lib.a -Wl,--no-whole-archive

Ответ 2

Для каждого, кто сталкивается с такой проблемой, как я (и не понял ответ правильно): вот короткое руководство по созданию динамической библиотеки (libmylib.so) из статической (mylib.a):

1.) создайте файл mylib.c, который импортирует только файл mylib.h

2.) скомпилируйте этот mylib.c в mylib.o с помощью

gcc -c -fPIC mylib.c -o msat.o

3.) создать динамическую библиотеку со следующей командой:

gcc --whole-archive -shared -Wl,-soname,libmylib.so -o libmylib.so mylib.o mylib.a 

Это работало, по крайней мере, для меня, превратив статическую библиотеку (скомпилированную с -fPIC) в динамическая библиотека. Я не уверен, что это будет работать для других библиотек.

Ответ 3

У меня почти похожая проблема. Этот трюк на самом деле работает. Две большие