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
但有一些注意事項:
- 在windows 上,您很可能必須設定一些宏,因此
jniexport
實際上是__declspec(dllexport)
,而不是__declspec(dllimport)
- 要在 linux 上連結
*.so
文件,您需要使用-fpic
編譯 c 文件
以上是找不到已編譯的c++函式庫函數的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

禪工作室 13.0.1
強大的PHP整合開發環境

SecLists
SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。

Dreamweaver CS6
視覺化網頁開發工具

ZendStudio 13.5.1 Mac
強大的PHP整合開發環境