Rumah  >  Artikel  >  Fungsi perpustakaan c++ yang disusun tidak ditemui

Fungsi perpustakaan c++ yang disusun tidak ditemui

WBOY
WBOYke hadapan
2024-02-08 23:57:19920semak imbas

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

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();
}

2. Gunakan arahan ini untuk mencipta fail helloworldjni.h

javac -h .  helloworldjni.java

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();
}

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

5. Hasilkan fail .o ke fail .dll

g++ -shared -o native.dll helloworldjni.o

6. Susun dan jalankan helloworldjni.java

java helloworldjni

Menerima ralat ini:

java: symbol lookup error: /home/centos/test5/native.dll: undefined symbol: myFunction

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


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!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam