java.lang.UnsatifiedLinkError JNI错误

java.lang.UnsatifiedLinkError JNI错误,java,c++,java-native-interface,Java,C++,Java Native Interface,我正在尝试使用Java本机接口 我使用这些命令创建了一个共享库对象.so文件 ln -s /usr/local/java/jdk1.7.0_21/include /usr/include/JNILibForProj gcc -I /usr/include/JNILibForProj -c -Wall -w -fpic CppCode.cpp gcc -shared -o libCppCode.so CppCode.o 我将.so文件放在/usr/lib中 我从那里加载其他库文件 但是,当我尝试

我正在尝试使用Java本机接口

我使用这些命令创建了一个共享库对象.so文件

ln -s /usr/local/java/jdk1.7.0_21/include /usr/include/JNILibForProj
gcc -I /usr/include/JNILibForProj -c -Wall -w -fpic CppCode.cpp
gcc -shared -o libCppCode.so CppCode.o
我将.so文件放在/usr/lib中 我从那里加载其他库文件

但是,当我尝试使用加载库时

System.loadLibrary("CppCode");
我得到的错误是

Exception in thread "main" java.lang.UnsatisfiedLinkError: /usr/lib/libCppCode.so: /usr/lib/libCppCode.so: undefined symbol: _ZSt4endlIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_
相同位置的其他.so文件正确加载。因此,文件的位置不是问题所在。我也尝试过用g++编译,但得到了相同的错误消息

任何帮助都将不胜感激!谢谢

编辑 实际上,我已经在CPP中编写了一些opencv代码,我正在尝试通过JNI进行链接。我现在使用这一行创建.so文件。我不是g++的ood,你能检查一下我写的东西是否正确吗

g++ -I/usr/local/include/opencv -I/usr/local/java/jdk1.7.0_21/include -I/usr/include/JNILibForProj -L/usr/local/lib -O0 -g3 -Wall -w -c -fpic -Wl,--add-stdcall-alias -shared -o "/home/shikhar/Desktop/myLib/libCppCode.so" "../src/CppCode.cpp" -lopencv_core -lpHash -lopencv_imgproc -lopencv_ml -lopencv_video -lopencv_features2d -lopencv_calib3d -lopencv_objdetect -lopencv_contrib -lopencv_flann -lopencv_highgui -lstdc++
在创建.so并将其复制到/usr/lib之后 上一条错误消息已消失,但现在我收到了

只能加载ET_DYN和ET_EXEC

编辑2

经过多次尝试,我终于想出了解决办法。请检查我的答案。

< P>符号缺失属于标准C++库。因此,必须确保标准C++库正确地链接到共享库。

通常,您可以通过向链接器行添加
-lstdc++
来实现:

gcc -shared -o libCppCode.so -lstdc++ CppCode.o

正确创建.so文件的最后一个命令是

g++ -shared "../src/JavaCPPInterfaceFaceRecognition.cpp" -o "/home/shikhar/Desktop/myLib/libJavaCPPInterfaceFaceRecognition.so" -I/usr/local/include/opencv -I/usr/local/java/jdk1.7.0_21/include -I/usr/include/JNILibForProj -L/usr/local/lib -O0 -g3 -Wall -w -fpic -lopencv_core -lpHash -lopencv_imgproc -lopencv_ml -lopencv_video -lopencv_features2d -lopencv_calib3d -lopencv_objdetect -lopencv_contrib -lopencv_flann -lopencv_highgui -lstdc++
在第一次编辑中,我提到的命令有一个错误,它使用了-c,因为它忽略了链接步骤
资料来源: