Saya memiliki perpustakaan yang dikompilasi (tanpa sumber) untuk driver sidik jari. Saya yakin ini adalah kompilasi ARM karena perintahnya file mylib.so
mengatakan:
Objek bersama ELF 32-bit LSB, ARM, versi 1 (SYSV), ditautkan secara dinamis, tidak dilucuti
tetapi jika saya ingin menggunakannya dalam program C ++ saya selalu memiliki kesalahan yang sama:
galat saat memuat pustaka bersama: mylib.so: tidak dapat membuka file objek bersama: Tidak ada file atau direktori tersebut
kesalahan ini seperti yang Anda lihat tidak terlalu eksplisit, tentu saja saya telah menggunakan perintah ekspor pada variabel LD_LIBRARY_PATH dengan jalur mylib.so.
jadi, Bagaimana mengetahui apakah pustaka ARM (.so) kompatibel dengan raspberry PI?
- Edit -
ldd libsgfdu03.so:
not a dynamic executable
ldd libsgfdu04.so:
not a dynamic executable
ldd libsgfpamx.so:
not a dynamic executable
Di SDK, dengan .so
, saya punya sampel program C ++ untuk mengelola driver. Dengan dua perintah untuk dikompilasi dalam satu makefile:
g++ -I./ -I../include -c main.cpp
-> termasuk satu file bernama "sgfplib.h"
g++ /usr/lib/arm-linux-gnueabihf/libusb.so -lpthread -lsgfpamx
-lsgfdu03 -lsgfplib -o ../bin/arm12/sgfplibtest_fdu03 main.o -L/home/pi/sdk/lib/arm12
Semua jalur baik dan tidak ada kesalahan yang dilaporkan pada waktu kompilasi, tetapi setelah ldd
pada executable akhir ldd sgfplibtest_fdu03
mengatakan:
/usr/lib/arm-linux-gnueabihf/libcofi_rpi.so (0xb6f76000)
libusb-0.1.so.4 => /lib/arm-linux-gnueabihf/libusb-0.1.so.4 (0xb6f5a000)
libpthread.so.0 => /lib/arm-linux-gnueabihf/libpthread.so.0 (0xb6f3b000)
libsgfpamx.so => not found
libsgfdu04.so => not found
libsgfplib.so => not found
libstdc++.so.6 => /usr/lib/arm-linux-gnueabihf/libstdc++.so.6 (0xb6e6e000)
libm.so.6 => /lib/arm-linux-gnueabihf/libm.so.6 (0xb6dfd000)
libgcc_s.so.1 => /lib/arm-linux-gnueabihf/libgcc_s.so.1 (0xb6dd5000)
libc.so.6 => /lib/arm-linux-gnueabihf/libc.so.6 (0xb6ca6000)
/lib/ld-linux-armhf.so.3 (0xb6f83000)
- Edit driver yang sama dengan debian x86 -
dpkg -S libsgfpamx.so
dpkg-query: no path found matching pattern *libsgfpamx.so*
ldd sgfplibtest_fdu03 :
linux-gate.so.1 => (0xb76eb000)
libusb-0.1.so.4 => /lib/libusb-0.1.so.4 (0xb76d1000)
libpthread.so.0 => /lib/i686/cmov/libpthread.so.0 (0xb76b8000)
libsgfpamx.so => /usr/local/lib/libsgfpamx.so (0xb769d000)
libsgfdu03.so => /usr/local/lib/libsgfdu03.so (0xb7632000)
libsgfplib.so => /usr/local/lib/libsgfplib.so (0xb7623000)
libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0xb7536000)
libm.so.6 => /lib/i686/cmov/libm.so.6 (0xb7510000)
libgcc_s.so.1 => /lib/libgcc_s.so.1 (0xb74f1000)
libc.so.6 => /lib/i686/cmov/libc.so.6 (0xb73aa000)
/lib/ld-linux.so.2 (0xb76ec000)
Exe yang sama (tetapi dikompilasi untuk x86) tampaknya tidak membutuhkan apa-apa lagi. Saya benar-benar tersesat ....
ldd mylib.so
dan lihat apa yang keluarldd
adalah cara yang baik untuk mengatakannya. Perhatikan bahwa tidak hanya ada satu arsitektur ARM - pi adalah ARM11, alias. ARMv6, dan ada ARMv7 (Cortex) yang tidak kompatibel. Saya tidak tahu cara mudah untuk membedakan executable.Jawaban:
Coba
ldd foo.so
dan lihat apakah ada keluaran yang masuk akal. Jika Anda mendapatkan "peringatan: Anda tidak memiliki izin eksekusi" itu karena file .so seharusnya dapat dieksekusi ;).Di luar itu, saya tidak tahu apakah ada cara sederhana untuk memeriksa .so untuk kompatibilitas sistem, tapi saya ragu Anda akan mendapatkan kesalahan "Tidak ditemukan" - Saya pikir itu benar-benar tidak dapat menemukannya (saya juga berpikir ada adalah kesalahan "format file yang tidak dikenali" yang lebih tepat, dan pada kenyataannya linker mungkin tidak mengenali masalah seperti itu untuk memulai). Jadi hanya untuk memastikan kita berada di halaman yang sama dengan itu:
Buat symlink di direktori yang sama,
ln -s foo.so libfoo.so.1
- nanti adalah apa yang akan dicari.Sekarang kompilasi program uji
g++ -L/directory/path test.cpp -lfoo
.Apakah masih tertulis "Tidak ada file atau direktori"?
Output ldd WRT, jika Anda mendapatkan hal-hal seperti ini:
Ini menunjukkan .so ditautkan ke .so lain yang tidak dapat ditemukan di lintasan pustaka dan karena itu kemungkinan tidak diinstal. Jika ada alasan untuk percaya ini adalah perpustakaan umum yang harus tersedia - mis. pthreads - Anda dapat mencari repositori raspbian untuk paket yang berisi file itu:
Sekarang kita tahu bahwa ada beberapa paket dengan nama file di dalamnya (libc6-dev, dan libc6: armhf). Tentu saja pthreads sudah terpasang. Kembali ke masalah Anda yang sebenarnya:
Sangat menyiratkan kita kurang beruntung WRT paket raspbian.
Pencarian online untuk "libsgfpamx.so" dan "sgfpamx" tidak menghasilkan ... apa-apa. Hampir pasti ini adalah hal-hal esoterik atau internal yang dibangun bersama
mylib.so
, dan jika Anda sudah memilikinya di suatu tempat Anda beruntung, jika tidak, Anda harus bertanya kepada orang-orang yang bertanggung jawab untuk "mylib.so".sumber
Lib Libib adalah Libug Secugen. Anda harus mendapatkan SDK dan membangunnya kembali untuk platform Anda.
sumber