首頁  >  文章  >  找不到已編譯的c++函式庫函數

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

WBOY
WBOY轉載
2024-02-08 23:57:19900瀏覽

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.com。如有侵權,請聯絡admin@php.cn刪除