gcc: как собрать дин. либу с слинкованной в нее статической
От:
Аноним
Дата:
10.11.06 11:07
Оценка:
Есть задача — завернуть статическую либу в динамическу.
Если кратко — JNI — обертка, для вызова данной поставщиком либы из java.
gcc нифига не знаю.
Делаю так (ногами не бить, как подсказали, так и делал):
(Что я хотел нижеприведенным сделать:
собрать GprsListener.cpp, юзающий либу libtracker.a в либу
liblistener.so):
./liblistener.so: undefined reference to `LT_GetEvent()'
./liblistener.so: undefined reference to `LT_Start(unsigned short)'
./liblistener.so: undefined reference to `LT_Stop()'
collect2: ld returned 1 exit status
____________
(перечисленные функции — из стстической либы)
Как собрать правильно?
Re: gcc: как собрать дин. либу с слинкованной в нее статичес
Здравствуйте, Аноним, Вы писали:
А>Как собрать правильно?
В свое время с полгода назад столкнулся с той же проблемой.
Я думаю суть проблемы понятна... Линкуются только те функции из статической библиотеки, которые используются в динамической. По скольку в динамической библиотеке некоторые функции не используются, то они и не попадают в результат.
Тут мне посоветовали делать следующее:
Вызов линкера у меня выглядит так:
g++ -rdynamic -Wl,-export-dynamic -shared -Wl,-soname,$(DLL_PARSERS) -o $(DLL_PARSERS) -Wl,--whole-archive $(LIB_PARSERS) -Wl,--no-whole-archive $(ANTLR_LIB)
Переменные означают следующее:
DLL_PARSERS — имя ДЛЛки, которую ты собираешь
LIB_PARSERS — те статические библиотеки, которые нужно включить целиком
ANTLR_LIB — в частности та библиотека, которая используется только внутри дллки и не должна торчать наружу.
Вариант 2 — распаковывать статическую библиотеку и линковать все объектники из нее непосредственно к твоей ДЛЛке.
Приведенный код работает для линукового линкера... У других линкеров могут быть другие флаги. Например в солярисе эти флаги называются " -Wl,-z,allextract" и "-Wl,-z,defaultextract" соответственно