最近项目中,遇到很多linux下java调用c++接口的问题,因此在这总结一下:
1.java 调用 so动态库的问题
undefined symbol: curl_global_init 检查动态库的依赖问题
can not load lib***.so 检查动态库是否存在问题,检查java调用动态库路径等等
此处要注意的问题是:linux 上 java 调用接口时,好像只能加载一个so文件,不能加载多个so文件。
而windows上是可以加载多个dll文件。
linux和windows 调用依赖库的顺序问题:
①linux是先调用库再依赖库
②windows是先依赖库再调用库
2.静态库的问题
①.a 文件并不是ELF文件
推荐个地址,对ELF文件讲解非常清晰: https://www.cnblogs.com/cdcode/p/5551649.html
②编译静态库
ar -x lib****.a 静态库解压
ar -rcs lib***.a src/*.o json/*.o 将所有的目标文件生成静态库
③静态库编译动态库
gcc -shared -fPIC libabc.a libdef.a -o libtest.so
此方法生成的 libtest.so 只有空架子, 没内容;
正确方法:
g++ -shared -fPIC -o libtest.so -L./ -Wl,--whole-archive -ladd -ldec -Wl,--no-whole-archive
--whole-archive 可以把 在其后面出现的静态库包含的函数和变量输出到动态库,--no-whole-archive 则关掉这个特性。