載入共享庫時出錯:內部錯誤

載入共享庫時出錯:內部錯誤

我交叉編譯了用於手臂跟隨的 OpenCV本指南,並建構了這個範例程式

當我第一次像這樣運行時:

./DisplayImage image.png

我有:

./DisplayImage:載入共用程式庫時出錯:
libopencv_highgui.so.3.1:無法開啟共用物件檔案:沒有這樣的檔案或目錄

所以我認為它需要圖書館libopencv_highgui.so.3.1。所以我將所有這些庫添加到/lib

(1) libopencv_highgui.so
(2) libopencv_highgui.so.3.1
(3) libopencv_highgui.so.3.1.0

符號連結:(1) -> (2) -> (3)

但現在我得到:

./DisplayImage:載入共用程式庫時發生錯誤:
lib/libopencv_highgui.so.3.1:內部錯誤

我運行了file庫和可執行檔來檢查它們的信息,這是輸出:

.../opencv/platforms/linux/my_build/lib$ file libopencv_highgui.so.3.1.0
libopencv_highgui.so.3.1.0: ELF 32-bit LSB shared object, ARM, EABI5 version 1 (SYSV), dynamically linked, BuildID[sha1]=1107ba22b36437bedb37dbfe0250626c14759be9, not stripped

.../opencv_sample$ file DisplayImage
DisplayImage: ELF 32-bit LSB executable, ARM, EABI5 version 1 (GNU/Linux), dynamically linked, interpreter /lib/ld-linux.so.3, for GNU/Linux 3.2.0, BuildID[sha1]=aef57fe79d0928ca3afdff8d1b65268e1ad72e77, not stripped

編輯:
運行readelf -d DisplayImage | grep NEEDED產生:

 0x00000001 (NEEDED)                     Shared library: [libopencv_highgui.so.3.1]
 0x00000001 (NEEDED)                     Shared library: [libopencv_imgcodecs.so.3.1]
 0x00000001 (NEEDED)                     Shared library: [libopencv_core.so.3.1]
 0x00000001 (NEEDED)                     Shared library: [libstdc++.so.6]
 0x00000001 (NEEDED)                     Shared library: [libgcc_s.so.1]
 0x00000001 (NEEDED)                     Shared library: [libc.so.6]
 0x00000001 (NEEDED)                     Shared library: [ld-linux-armhf.so.3]

我發現他們都在我的目標上,除了ld-linux-armhf.so.3

是什麼導致了這個「內部錯誤」問題?

答案1

當編譯二進位檔案時,它可以使用共享庫,這些庫是帶有版本號的引用,以便您獲得受支援的庫版本。

有時,您可以透過符號將較新的庫連結到較舊的名稱,二進位檔案將嘗試使用此名稱。

但這並不意味著二進位檔案將支援該版本。某些功能可能已更改,某些功能已刪除或添加,等等。

因此,我建議針對較新的庫版本重新編譯二進位文件,在編譯時將標記不相容性。

您可以使用 ldd 查看庫依賴關係。

例子;

$ ldd /bin/ls
    linux-vdso.so.1 (0x00007ffc65ff3000)
    libselinux.so.1 => /lib/x86_64-linux-gnu/libselinux.so.1 (0x00007f9033f91000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f9033bf1000)
    libpcre.so.3 => /lib/x86_64-linux-gnu/libpcre.so.3 (0x00007f9033979000)
    libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f9033771000)
    /lib64/ld-linux-x86-64.so.2 (0x0000558f25845000)
    libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f9033551000)

編輯:ps ...您不能只跨庫複製,因為它們有自己的依賴項。您的交叉編譯機器將需要類似的函式庫版本來進行編譯。

相關內容