Rumah > Java > teks badan

Fungsi perpustakaan c++ yang disusun tidak ditemui

WBOY
Lepaskan: 2024-02-08 23:57:19
ke hadapan
921 orang telah melayarinya

Apabila editor php Youzi menulis program C++, kadangkala dia mungkin menghadapi masalah "tidak dapat mencari fungsi perpustakaan C++ yang disusun". Ralat ini biasanya berlaku semasa fasa pemautan dan bermakna pengkompil tidak dapat mencari fungsi perpustakaan yang diperlukan. Mungkin terdapat banyak sebab untuk masalah ini, seperti konfigurasi laluan fail perpustakaan yang salah, pemasangan fail perpustakaan yang salah, dsb. Untuk menyelesaikan masalah ini, kami boleh membetulkannya dengan menyemak laluan fail perpustakaan, memasang semula fail perpustakaan dan mengemas kini pengkompil. Dalam artikel ini, kami akan memperincikan cara membetulkan ralat kompilasi biasa ini.

Kandungan soalan

Saya mempunyai fail bernama libmylibrary.a dan fail pengepala bernama mylibrary.h yang mengandungi fungsi bernama myfunction(). Saya menggabungkannya dengan fail cpp (helloworldjni.cpp) dan mencipta pustaka baharu yang dipanggil native.dll. Walau bagaimanapun, apabila saya cuba menyusun native.dll dalam java menggunakan jni, saya tidak dapat mencari fungsi dalam libmylibrary.a dan 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
Salin selepas log masuk

Ini adalah langkah-langkah yang saya ikuti

1. Buat fail java (helloworldjni.java) untuk menyepadukan jni

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();
}
Salin selepas log masuk

2. Gunakan arahan ini untuk mencipta fail helloworldjni.h

javac -h .  helloworldjni.java
Salin selepas log masuk

3 Sepadukan fail mylibrary.h dan fail helloworldjni.h dengan fail cpp saya (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();
}
Salin selepas log masuk

4 Susun fail ini (buat fail .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
Salin selepas log masuk

5. Hasilkan fail .o ke fail .dll

g++ -shared -o native.dll helloworldjni.o
Salin selepas log masuk

6. Susun dan jalankan helloworldjni.java

java helloworldjni
Salin selepas log masuk

Menerima ralat ini:

java: symbol lookup error: /home/centos/test5/native.dll: undefined symbol: myFunction
Salin selepas log masuk

Bagaimana cara saya memasukkan libmylibrary.a ke dalam kompilasi kod java saya untuk memastikan ia mengenali fungsi dalam libmylibrary.a?

ps: Saya pasti tidak ada yang salah dengan libmylibrary.a kerana saya dapat memanggil myfunction() menggunakan c++ tulen tetapi nampaknya terdapat beberapa jenis masalah pautan apabila menggunakan jni yang saya tidak dapat fikirkan

Penyelesaian

Saya mencuba semua langkah anda dan membuat sedikit perubahan dan ini berkesan untuk saya. Skrip binaan tambahan:

#!/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


Salin selepas log masuk

Tetapi terdapat beberapa kaveat:

  1. Pada tetingkap kemungkinan besar anda perlu menyediakan beberapa makro, jadi jniexport 实际上是 __declspec(dllexport),而不是 __declspec(dllimport)
  2. Untuk memaut pada linux *.so 文件,您需要使用 -fpic menyusun fail c++

Atas ialah kandungan terperinci Fungsi perpustakaan c++ yang disusun tidak ditemui. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Label berkaitan:
sumber:stackoverflow.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan