g ++,ld和JNI - 链接问题

时间:2010-12-10 22:11:29

标签: java linker g++ java-native-interface solaris

我有两个第三方库文件,名为libA.a和libB.a

它们是用g ++构建的。

现在,我需要使用JNI从java进行函数调用。

我有一个名为wrapper.cpp的JNI包装器文件,并尝试创建一个library.so文件,该文件可以加载到我的java程序中并进行函数调用。

我首先使用g ++编译了wrapper.cpp,并尝试使用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

Google搜索这些错误无济于事(

有人可以告诉我哪里出错了吗?

注意:我在SunOS 5.10上使用g ++ 3.4.3

2 个答案:

答案 0 :(得分:4)

尝试将-lstdc ++添加到链接器命令中。您可能还需要--enable-auto-import。

答案 1 :(得分:0)

使用clang ++。 -lstdc ++没有定义_ZNSt8ios_base4InitC1Ev符号。尝试将库-lgnustl_shared添加到链接器命令。这对我有用。