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中文網其他相關文章!