php小编柚子在编写C++程序时,有时可能会遇到“找不到已编译的C++库函数”的问题。这个错误通常发生在链接阶段,意味着编译器无法找到所需的库函数。造成这个问题的原因可能有多种,比如库文件路径配置错误、库文件未正确安装等。为了解决这个问题,我们可以通过检查库文件路径、重新安装库文件以及更新编译器等方法来修复。在本文中,我们将详细介绍如何解决这个常见的编译错误。
我有一个名为 libmylibrary.a 的文件和一个名为 mylibrary.h 的头文件 其中包含一个名为 myfunction() 的函数。我将它们与 cpp 文件 (helloworldjni.cpp) 结合起来,创建了一个名为 native.dll 的新库。但是,当我尝试使用 jni 在 java 中编译 native.dll 时,我无法找到 libmylibrary.a 和 mylibrary.h 中的函数。
mylibrary.h
// mylibrary.h #ifndef mylibrary_h #define mylibrary_h #ifdef __cplusplus extern "c" { #endif void myfunction(); // declare the function prototype #ifdef __cplusplus } #endif #endif // mylibrary_h
这些是我遵循的步骤
1.创建用于集成jni的java文件(helloworldjni.java)
public class helloworldjni { static { system.load("/home/centos/test5/native.dll"); } public static void main(string[] args) { new helloworldjni().sayhello(); } //native method with no body public native void sayhello(); }
2.使用此命令创建了 helloworldjni.h 文件
javac -h . helloworldjni.java
3.将mylibrary.h文件和helloworldjni.h文件与我的cpp文件(helloworldjni.cpp)集成
#include<iostream> #include<jni.h> #include "mylibrary.h" #include "helloworldjni.h" void sayhello(){ myfunction(); } int main() { sayhello(); // call the function from the library return 0; } jniexport void jnicall java_helloworldjni_sayhello (jnienv* env, jobject thisobject) { sayhello(); }
4.编译这些文件(创建.o文件)
g++ helloworldjni.cpp -l. -lmylibrary -i"/home/centos/jdk-21.0.1/include" -i"/home/centos/jdk-21.0.1/include/linux" -o helloworldjni.o
5.生成.o文件到.dll文件
g++ -shared -o native.dll helloworldjni.o
6.编译并运行helloworldjni.java
java helloworldjni
收到此错误:
java: symbol lookup error: /home/centos/test5/native.dll: undefined symbol: myFunction
如何将 libmylibrary.a 合并到我的 java 代码编译中,以确保它能够识别 libmylibrary.a 中的函数?
ps:我确信 libmylibrary.a 没有问题,因为我能够使用纯 c++ 调用 myfunction() 但在使用 jni 时似乎存在某种我无法弄清楚的链接问题
我尝试了您的所有步骤并进行了一些细微的更改,这对我有用。附加构建脚本:
#!/bin/sh JAVA_SDK_HOME=/home/user/lib/jdk-21.0.1 #echo BUILD THE LIB #g++ -c mylibrary.cpp -o mylibrary.o #ar rcs libmylibrary.a mylibrary.o echo MAKE JAVA STUB $JAVA_SDK_HOME/bin/javac -h . HelloWorldJNI.java echo BUILD SO file g++ -c -fPIC -o HelloWorldJNI.o HelloWorldJNI.cpp \ -I $JAVA_SDK_HOME/include/ \ -I $JAVA_SDK_HOME/include/linux g++ -shared -o native.dll HelloWorldJNI.o -L. -lmylibrary echo TESTING $JAVA_SDK_HOME/bin/java HelloWorldJNI
但有一些注意事项:
jniexport
实际上是 __declspec(dllexport)
,而不是 __declspec(dllimport)
*.so
文件,您需要使用 -fpic
编译 c++ 文件以上是找不到已编译的c++库函数的详细内容。更多信息请关注PHP中文网其他相关文章!