Как связать статическую библиотеку с динамической библиотекой в 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
. Что я делаю неправильно?
Ответы
Ответ 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
У меня почти похожая проблема. Этот трюк на самом деле работает. Две большие