【问题标题】:C++ linking custom .so libraries and then with JNIC++ 链接自定义 .so 库,然后与 JNI
【发布时间】:2015-07-12 11:44:14
【问题描述】:

我在链接 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 调用。我尝试了几种不同的组装链接参数的变体,但都没有奏效。我在 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++ 文档,但是无论我如何订购它们,无论我使用什么参数,它似乎不起作用。对于如何链接这些文件的任何建议,我将不胜感激。

【问题讨论】:

  • 通常您使用-L&lt;path&gt; 表示将找到共享库的路径,然后使用-l&lt;name&gt; 表示您希望链接的库,其中库文件名为lib&lt;name&gt;.so。因此,如果您的共享库位于 /absolute/path/library1.so 中,您将使用选项 -L/absolute/path-lrary1
  • 你是对的。然而它并没有改变任何东西。仍然出现同样的错误。
  • 在拨打System.loadLibrary("my_file.so")之前尝试System.load("rary1")和“rary2”
  • 也没用。
  • 请更新您的问题以反映您当前的状态。

标签: c++ linker java-native-interface g++ shared-libraries


【解决方案1】:

在一些帮助下想通了。

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

【讨论】:

    猜你喜欢
    • 2017-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-03
    • 2012-09-01
    相关资源
    最近更新 更多