gpt4 book ai didi

C++ 链接自定义 .so 库,然后使用 JNI

转载 作者:行者123 更新时间:2023-11-28 06:10:31 25 4
gpt4 key购买 nike

我在链接 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

这两个includes指定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 调用。我尝试了几种不同的组合链接参数的变体,但都没有奏效。我在 my_file.so 和 library1.so 的绝对路径上进一步调用 Java 中的 System.load()目前我收到一个错误:

/usr/lib/jvm/java-7-openjdk-amd64/bin/java: symbol lookup error: /<absoulte path>/my_file.so: undefined symbol: <method from library 1>

我在这里阅读了几篇关于库的链接和所需参数顺序的文章,以确保正确的链接,并且我已经阅读了很多 g++ 文档,但无论我如何排序它们,无论我使用什么参数,它似乎不起作用。对于如何链接这些文件的任何建议,我将不胜感激。

最佳答案

在一些帮助下弄清楚了。

首先,对于那些不知道 linux 上命令“ldd”的人,它显示了链接符号(链接库依赖项)。当我看到我的库不在那里时,我试图重新排列链接命令。我必须将目标文件 my_file.o 放在其他两个库之前。然后我看到 ldd 指出找不到库。我将它们移到系统库中,并使用更多符号链接(symbolic link)一切正常。感谢大家的付出

关于C++ 链接自定义 .so 库,然后使用 JNI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31367406/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com