g ++, ld и JNI - проблема связывания - PullRequest
2 голосов
/ 11 декабря 2010

У меня есть два файла библиотеки сторонних производителей, которые называются libA.a и libB.a

Они построены с G ++.

Теперь мне нужно выполнять вызовы функций из Java с использованием JNI.

У меня есть файл-оболочка JNI, называемый wrapper.cpp, и я попытался создать файл library.so, который можно загрузить в мою программу java и выполнить вызовы функций.

Сначала я скомпилировал wrapper.cpp, используя g ++, и попытался связать все объектные файлы, используя ld.

Это команды, которые я использовал.

%g++ wrapper.cpp -I /usr/java/include/ -I /usr/java/include/solaris/  libA.a  libB.a -L /lib/*.so -c 

Это созданное wrapper.o

%ld -L /usr/java/lib/ -L /lib/ -b wrapper.o libA.a  libB.a -o wrapper.so -m

Это дает мне следующую ошибку:

Undefined                       first referenced
 symbol                             in file
_ZNKSsixEj                          wrapper.o
_ZNSt8ios_base4InitD1Ev             wrapper.o
_ZNSt8ios_base4InitC1Ev             wrapper.o
__gxx_personality_v0                wrapper.o
_ZNKSs4sizeEv                       wrapper.o
ld: fatal: Symbol referencing errors. No output written to wrapper.so

Поиск этих ошибок не помогает: (

Может кто-нибудь сказать мне, где я иду не так?

Примечание: я использую g ++ 3.4.3 в SunOS 5.10

Ответы [ 2 ]

4 голосов
/ 11 декабря 2010

Попробуйте добавить -lstdc ++ к вашей команде компоновщика.Вам также может понадобиться --enable-auto-import.

0 голосов
/ 07 августа 2014

Использование clang ++. -lstdc ++ не имеет определенного символа _ZNSt8ios_base4InitC1Ev. Попробуйте добавить библиотеку -lgnustl_shared к вашей команде компоновщика. Это сработало для меня.

...