【发布时间】: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<path>表示将找到共享库的路径,然后使用-l<name>表示您希望链接的库,其中库文件名为lib<name>.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