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.
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
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:
jniexport
实际上是 __declspec(dllexport)
,而不是 __declspec(dllimport)
*.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!