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 文件
立即学习“C++免费学习笔记(深入)”;
javac -h . helloworldjni.java
3.将mylibrary.h文件和helloworldjni.h文件与我的cpp文件(helloworldjni.cpp)集成
#include#include #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文件
wordpress外贸网站the9 store主题源码第一:上传网站程序到你的空间。第二:数据库操作,使用phpmyadmin,新建一个数据库或选择一个已有的数据库存, 导入根目录下的 wp.sql 文件。这一步一定要成功。 第三:编辑wp-config.php,找到第一行的 define('WP_HOME','http://www.t****.com'); 把上面的域名http://www.t*
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
但有一些注意事项:
- 在 windows 上,您很可能必须设置一些宏,因此
jniexport实际上是__declspec(dllexport),而不是__declspec(dllimport) - 要在 linux 上链接
*.so文件,您需要使用-fpic编译 c++ 文件










