我在连接C ++库时遇到问题,我真的可以使用一些建议。 我有两个自定义.so库,我在我的cpp项目中使用它,然后我使用JNI链接到Java。
在我的cpp项目中,我包含了两个库和JNI的头文件。然后我创建了一个目标文件,如下所示:
g++ -I/usr/lib/jvm/java-7-openjdk-amd64/include -I/usr/lib/jvm/java-7-openjdk-amd64/include/linux -std=c++11 -fPIC -c my_file.cpp
这两个包括指定JNI库的路径。我正在使用cpp11然后切换-fpic我发现在创建共享库时可能需要它。
接下来,我尝试将我的目标文件:my_file.o与两个共享库链接起来:
g++ -fpic -L/<absolute path>/library1.so -L/<absolute path>/library2.so my_file.o -shared -o my_file.so
我正在构建一个使用JNI从Java调用的共享库。我尝试了几种不同的组合链接参数的变化但没有工作。我在Java中进一步调用System.load()的绝对路径到my_file.so和library1.so 目前我收到一个错误:
/usr/lib/jvm/java-7-openjdk-amd64/bin/java: symbol lookup error: /<absoulte path>/my_file.so: undefined symbol: <method from library 1>
我已经阅读了几篇关于库的链接和必需参数顺序的文章,以确保正确的链接,并且我已经完成了大量的g ++文档,但无论我如何订购它们,无论我使用什么参数,它似乎不起作用。关于如何链接这些文件,我将非常满意。
答案 0 :(得分:1)
在一些帮助下想出来。
首先,对于那些不了解命令的人来说,&#34; ldd&#34;在linux上,它显示了链接的符号(链接库依赖项)。当我看到我的图书馆不在那里时,我试图重新排列链接命令。 我不得不将对象文件my_file.o放在另外两个库之前。然后我看到ldd指出找不到库。我将它们移动到一个系统库中,并且使用了一些符号链接,一切正常。感谢大家的努力