目錄
問題內容
解決方法
首頁 Java 找不到已編譯的c++函式庫函數

找不到已編譯的c++函式庫函數

Feb 08, 2024 pm 11:57 PM
編譯錯誤 lsp

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

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡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脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

<🎜>:泡泡膠模擬器無窮大 - 如何獲取和使用皇家鑰匙
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系統,解釋
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
Mandragora:巫婆樹的耳語 - 如何解鎖抓鉤
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

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

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1666
14
CakePHP 教程
1425
52
Laravel 教程
1325
25
PHP教程
1272
29
C# 教程
1252
24
紅米Note13RPro怎麼調整字體大小? 紅米Note13RPro怎麼調整字體大小? May 07, 2024 pm 06:34 PM

不要改變原內容的意思,微調內容,重寫內容,不要續寫紅米Note13RPro不僅性能出色,使用體驗更加出色,為了讓大家有更舒適的使用體驗,紅米Note13RPro配備了字體調整功能,讓用戶能夠調整自己的手機的字體。如果你想知道紅米Note13RPro怎麼調整字體大小,那就來看看吧。紅米Note13RPro怎麼調整字體大小? 1.開啟“設定”應用程式。 2.捲動到底部,選擇“顯示”。 3.點選“文字大小”。 4.在此畫面上,您可以拖曳滑桿調整字體大小或選擇預設字體大小。 5.調整完畢後,按「確定」保

紅米Note13RPro怎麼擷取圖中的文字? 紅米Note13RPro怎麼擷取圖中的文字? May 08, 2024 pm 10:00 PM

紅米Note13RPro手機在軟體功能上整合了多項智慧工具,其中,從圖片中快速準確地提取文字內容便是其中之一,下面小編將為大家介紹紅米Note13RPro如何提取圖片中的文字。紅米Note13RPro怎麼擷取圖中的文字?使用小米掃碼功能,打開手機的掃碼應用,點擊圖片圖標,選擇一張圖片,然後點擊右邊的「識別文字」選項,成功提取圖片中的文字。透過手機相簿操作。在手機相簿中找到需要提取文字的圖片,點擊圖片下方的“更多”,選擇“提取文字”,識別成功後,可以根據需要複製或保存文字。利用微信小程式。打開微

紅米Note13RPro怎麼連接電腦? 紅米Note13RPro怎麼連接電腦? May 09, 2024 pm 06:52 PM

RedmiNote13RPro這款手機最近是非常火爆的,很多消費者都購買了這款手機,不過很多用戶是第一次使用這款手機所以不清楚紅米Note13RPro怎麼連接電腦,對此,小編在這裡為大家帶來了詳細的教學介紹。紅米Note13RPro怎麼連接電腦? 1.使用USB線將紅米手機連接到電腦的USB介面。 2.開啟手機設置,擊選項,將USB調試開啟。 3.在電腦上開啟裝置管理員,找到行動裝置選項。 4.右鍵點選行動裝置,選擇更新驅動程式,然後選擇自動搜尋更新的驅動程式。 5.如果電腦沒有自動搜尋到驅動程序,

《整個活吧》全關卡通關攻略大全 《整個活吧》全關卡通關攻略大全 May 07, 2024 pm 06:31 PM

整個活吧是一款非常好玩的休閒解謎小遊戲,大家可以在多平台體驗!遊戲提供了無數精彩的關卡等待解鎖,每個關卡都充滿了新奇和挑戰,讓你體驗回答問題的有趣冒險,開啟全新的遊戲內容。那麼整個活吧全關卡怎麼通關呢?今天為大家帶來了《整個活吧》全關卡通關攻略大全分享,大家過關遇到問題可以來參考一下哦! 《整個活吧》全關卡通關攻略大全《整個活吧》全關卡通關攻略大全幫她守歲人鬼情未了幫小姐姐識別渣男狼外婆幫小女孩脫離危險戶外探險假裝看不見阿飄變回人形幫猩猩修成人形後座有人保持鎮定和女鬼週旋夜班出租車保持鎮定和女鬼週

《塵白禁區》星塵回憶武器介紹一覽 《塵白禁區》星塵回憶武器介紹一覽 May 08, 2024 pm 04:22 PM

《塵白禁區》星塵回憶怎麼樣?在塵白禁區遊戲中有著許多的強力武器可供玩家進行選擇使用,下面就跟著小編來詳細了解一下塵白禁區星塵回憶武器的詳細屬性吧,希望可以給玩家們帶來幫助。 《塵白禁區》星塵回憶武器介紹一覽武器資訊武器介紹名稱星塵回憶品級五星級衝鋒槍元素低溫射速950彈容50換彈速度1.35武器技能:雪患低溫類傷害提升18%/30%;使用常規技後,立刻獲得6層【行星覆冰】效果,常規技造成傷害獲得1層【行星覆冰】,觸發間隔為2秒;每層【行星覆冰】提升常規技傷害提升3%/ 5%,可疊加12層持續3秒。

《整個活吧》拯救鄰居勸所有鄰居下樓通關攻略 《整個活吧》拯救鄰居勸所有鄰居下樓通關攻略 May 07, 2024 pm 07:00 PM

整個活吧是抖音上非常火辣的趣味闖關小遊戲,遊戲中有超多的關卡等大家挑戰!遊戲中關卡拯救鄰居這一關需要勸所有鄰居下樓,具體怎麼過關呢?以下是小編帶給大家的《整個活吧》拯救鄰居勸所有鄰居下樓通關攻略,不清楚如何過關的小夥伴們一起來看看吧,希望能幫到大家。 《整個活吧》拯救鄰居勸所有鄰居下樓通關攻略拯救鄰居勸所有鄰居下樓1、樓下有人需要急救2、樓下書店在賣絕版學習資料3、樓下垃圾桶好多紙箱4、我答應約會,你先下樓5、你家哥哥來咱們小區做推廣了6、有人發現了新的釣魚點7、拖動貓罐頭到樓下8、拖動叉子給

VESA 宣布 DisplayHDR 1.2 規範,提高效能需求:增加色彩準確度、寬色域等 VESA 宣布 DisplayHDR 1.2 規範,提高效能需求:增加色彩準確度、寬色域等 May 08, 2024 pm 02:13 PM

本站5月8日消息,視訊電子標準協會(VESA)今天發布新聞稿,宣布DisplayHDR1.2規範,並表示目前全球有超過3000款顯示器型號通過DisplayHDR標準認證。 DisplayHDR1.2版本規範帶來了更嚴格的性能要求,對亮度、色域和位元深度之外,還引入色彩精度、對比度、黑電平(blacklevel,指在經過一定校準的顯示裝置上,沒有一行光亮輸出的視訊訊號電平)和字幕閃爍的多項新測試要求。 DisplayHDRv1.2改進了白色亮度等級測試,將黑色背景上的10%中心色塊測試更改為非黑色背景

紅米Note13RPro怎麼加入小元件? 紅米Note13RPro怎麼加入小元件? May 07, 2024 pm 07:55 PM

紅米最近剛推出的RedmiNote13RPro就非常火爆,剛上市就擁有很不錯的銷量,不少消費者都入手了這款手機,為了讓大家更好的使用紅米Note13RPro,小編在這裡為大家帶來了紅米Note13RPro添加小組件的方法介紹。紅米Note13RPro怎麼加入小元件? 1.點選新增小工具長按桌面後點選新增小工具的選項。 2.點選元件名稱選擇需要新增到小元件名稱。 3.點選新增到桌面選擇下方的新增到桌面選項。 4.點選確定選擇右上角的確定圖示即可。常見問題連接藍牙換輸入法主題更換出廠設定隱藏應用投影電視