Làm sao để biết thư viện ARM (.so) có tương thích với PI mâm xôi không


8

Tôi có một thư viện được biên dịch (không có nguồn) cho trình điều khiển vân tay. Tôi chắc chắn đó là một trình biên dịch ARM vì lệnh này file mylib.sonói:

Đối tượng chia sẻ LSB 32 bit ELF, ARM, phiên bản 1 (SYSV), được liên kết động, không bị tước

nhưng nếu tôi muốn sử dụng chúng trong chương trình C ++ thì tôi luôn có cùng một lỗi:

lỗi trong khi tải thư viện dùng chung: mylib.so: không thể mở tệp đối tượng dùng chung: Không có tệp hoặc thư mục như vậy

lỗi này giống như bạn thấy nó không rõ ràng lắm, tất nhiên tôi đã sử dụng lệnh xuất trên biến LD_LIBRARY_PATH với đường dẫn của mylib.so.

vậy, Làm thế nào để biết một thư viện ARM (.so) có tương thích với PI mâm xôi không?

-- Biên tập --

ldd libsgfdu03.so:
not a dynamic executable

ldd libsgfdu04.so:
not a dynamic executable

ldd libsgfpamx.so:
not a dynamic executable

Trong SDK, với .so, tôi có một chương trình C ++ mẫu để quản lý trình điều khiển. Với hai lệnh để biên dịch trong một makefile:

g++ -I./ -I../include -c main.cpp -> bao gồm một tệp có tên "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

Tất cả các đường dẫn đều tốt và không có lỗi nào được báo cáo tại thời điểm biên dịch, nhưng sau khi lddthực thi cuối cùng sẽ ldd sgfplibtest_fdu03nói:

    /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)

- Chỉnh sửa cùng trình điều khiển với 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)

Cùng một exe (nhưng được biên dịch cho x86) dường như không yêu cầu gì thêm. Tôi hoàn toàn bị mất ....


Nó có thể phụ thuộc vào một cái gì đó không được cài đặt. Chạy ldd mylib.sovà xem những gì đi ra
Lawrence

ldd mylib.so nói "không phải là một thực thi động" :(
Gilles Grandguillaume

"không phải là một thực thi năng động" == Tôi nghĩ bạn đã hết may mắn. ldd một cách tốt để nói Lưu ý rằng không chỉ có một kiến ​​trúc ARM - pi là ARM11, hay còn gọi là. ARMv6 và có ARMv7 (Cortex) không tương thích. Tôi không biết một cách dễ dàng để phân biệt các thực thi mặc dù.
goldilocks

Đó là trình điều khiển ngược. Trình điều khiển dành cho ARM9, tôi đoán một số chương trình cho ARM9 tương thích với ARM11. nhưng trong trường hợp của tôi ... dường như không :(.
Gilles Grandguillaume

Câu trả lời:


4

Thử ldd foo.so và xem nếu có bất kỳ đầu ra hợp lý. Nếu bạn nhận được "cảnh báo: bạn không có quyền thực thi" thì đó là vì các tệp .so được cho là có thể thực thi được ;).

Ngoài ra, tôi không biết có cách nào đơn giản để kiểm tra .so cho khả năng tương thích hệ thống hay không, nhưng tôi nghi ngờ bạn sẽ gặp lỗi "Không tìm thấy" - Tôi nghĩ rằng nó thực sự không thể tìm thấy (Tôi cũng nghĩ là có là một lỗi "định dạng tệp không được nhận dạng" thích hợp hơn và trên thực tế, trình liên kết có thể không nhận ra vấn đề như vậy để bắt đầu). Vì vậy, để chắc chắn rằng chúng ta đang ở trên cùng một trang với điều đó:

  • Tạo một liên kết tượng trưng trong cùng thư mục, ln -s foo.so libfoo.so.1 - sau này là thứ mà ld sẽ tìm kiếm.

  • Bây giờ biên dịch một chương trình thử nghiệm g++ -L/directory/path test.cpp -lfoo .

Nó vẫn nói "Không có tập tin hoặc thư mục như vậy"?

Đầu ra ldd WRT, nếu bạn nhận được những thứ như thế này:

libsgfpamx.so => not found

Nó chỉ ra .so được liên kết với một .so khác không thể tìm thấy trong đường dẫn thư viện và do đó có khả năng không được cài đặt. Nếu có lý do để tin rằng đây là một thư viện phổ biến nên có sẵn - ví dụ. pthreads - bạn có thể tìm kiếm kho lưu trữ raspbian cho các gói chứa tệp đó:

> dpkg -S libpthread.so
libc6-dev:armhf: /usr/lib/arm-linux-gnueabihf/libpthread.so
libc6:armhf: /lib/arm-linux-gnueabihf/libpthread.so.0

Bây giờ chúng ta biết rằng có một số gói có tên tệp như vậy trong đó (libc6-dev và libc6: armhf). Tất nhiên pthreads đã được cài đặt nào. Quay trở lại vấn đề thực tế của bạn:

dpkg -S libsgfpamx.so
dpkg-query: no path found matching pattern *libsgfpamx.so*

Ngụ ý mạnh mẽ rằng chúng ta hết may mắn WRT một gói raspbian.

Tìm kiếm trực tuyến cho "libsgfpamx.so" và "sgfpamx" trả về ... không có gì. Hầu như chắc chắn đây là những điều bí truyền hoặc nội bộ được xây dựng cùng mylib.so, và nếu bạn có chúng ở đâu đó thì bạn đã gặp may, nếu không bạn sẽ phải hỏi thăm những người chịu trách nhiệm về "mylib.so".


tôi đã chỉnh sửa câu hỏi của tôi
Gilles Grandguillaume

@GillesGrandguillaume: Tôi đã thêm vào cuối câu trả lời của mình để trả lời.
goldilocks

vì vậy tôi không hiểu tại sao cùng một mã mẫu hoạt động trên debian ... với cùng một câu trả lời của lệnh "dpkg -S libsgfpamx.so" .i đã chỉnh sửa câu hỏi của tôi. xin lỗi vì đã lãng phí thời gian của bạn
Gilles Grandguillaume

-2

Các lib lib lib là các libs Secugen. Bạn sẽ phải lấy SDK và xây dựng lại chúng cho nền tảng của bạn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.