gcc: как собрать дин. либу с слинкованной в нее статической
От: Аноним  
Дата: 10.11.06 11:07
Оценка:
Есть задача — завернуть статическую либу в динамическу.
Если кратко — JNI — обертка, для вызова данной поставщиком либы из java.

gcc нифига не знаю.

Делаю так (ногами не бить, как подсказали, так и делал):
(Что я хотел нижеприведенным сделать:
собрать GprsListener.cpp, юзающий либу libtracker.a в либу
liblistener.so):

gcc -fPIC -c GprsListener.cpp -o GprsListener.o -I./include/linux -I./include
gcc -shared -o liblistener.so -Llib -ltracker -lm GprsListener.o -lstdc++

Собирается. При вызове из java говорит, что не может найти вызываемую функцию (функцию из libtracker.a).

Тоже самое, при сборке теста:

gcc -c test.c
gcc test.o -L. -llistener -o restest -lstdc++

Ругается:

./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: как собрать дин. либу с слинкованной в нее статичес
От: Graf Alex Украина http://grafalex.oberon.kiev.ua
Дата: 10.11.06 12:28
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Как собрать правильно?

В свое время с полгода назад столкнулся с той же проблемой.

Я думаю суть проблемы понятна... Линкуются только те функции из статической библиотеки, которые используются в динамической. По скольку в динамической библиотеке некоторые функции не используются, то они и не попадают в результат.

Тут мне посоветовали делать следующее:

Вызов линкера у меня выглядит так:
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" соответственно
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.