搜尋
首頁Java找不到已編譯的c++函式庫函數

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


但有一些注意事項:

  1. 在windows 上,您很可能必須設定一些宏,因此jniexport 實際上是__declspec(dllexport),而不是__declspec(dllimport)
  2. 要在 linux 上連結 *.so 文件,您需要使用 -fpic 編譯 c 文件

以上是找不到已編譯的c++函式庫函數的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文轉載於:stackoverflow。如有侵權,請聯絡admin@php.cn刪除

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
1 個月前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
1 個月前By尊渡假赌尊渡假赌尊渡假赌
威爾R.E.P.O.有交叉遊戲嗎?
1 個月前By尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

SecLists

SecLists

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

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強大的PHP整合開發環境