如何知道ARM库(.so)是否与raspberry PI兼容


9

我有一个用于指纹驱动程序的编译库(无源)。我确定它是ARM编译的,因为命令file mylib.so说:

ELF 32位LSB共享对象,ARM,版本1(SYSV),动态链接,未剥离

但是如果我想在C ++程序中使用它们,我总是会遇到相同的错误:

加载共享库时出错:mylib.so:无法打开共享对象文件:没有这样的文件或目录

就像您看到的那样,此错误不是很明显,当然我在mylib.so路径中对变量LD_LIBRARY_PATH使用了export命令。

因此,如何知道ARM库(.so)是否与raspberry PI兼容?

-编辑-

ldd libsgfdu03.so:
not a dynamic executable

ldd libsgfdu04.so:
not a dynamic executable

ldd libsgfpamx.so:
not a dynamic executable

在SDK中,使用.so,我有一个示例C ++程序来管理驱动程序。使用两个命令在一个makefile中进行编译:

g++ -I./ -I../include -c main.cpp ->包含一个名为“ 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

所有路径都很好,并且在编译时没有错误报告,但是ldd最后的可执行文件之后显示ldd sgfplibtest_fdu03

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

-使用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(但针对x86编译)似乎并不需要。我完全迷路了....


这可能取决于未安装的东西。跑步ldd mylib.so,看看会发生什么
劳伦斯

ldd mylib.so说“不是动态可执行文件” :(
Gilles Grandguillaume13

“不是动态可执行文件” ==我认为您很不幸。 ldd 一个很好的告诉方式。请注意,不仅有一种ARM体系结构-pi是ARM11,又名。ARMv6,并且有一个不兼容的ARMv7(Cortex)。我不知道一种简单的方法来区分可执行文件。
goldilocks

是相反的。驱动程序是用于ARM9的,我想某些用于ARM9的程序与ARM11兼容。但对我来说......似乎没有:(。
吉尔斯Grandguillaume

Answers:


4

尝试ldd foo.so看看是否有任何合理的输出。如果收到“警告:您没有执行权限”,那是因为.so文件应该是可执行的 ;)。

除此之外,我不知道是否有一种简单的方法来检查.so以获得系统兼容性,但是我怀疑您会收到“未找到”错误-我认为它确实找不到(我也认为那里是更合适的“无法识别文件格式”错误,实际上,链接器可能无法识别此类问题。因此,只需确保我们与该页面位于同一页面即可:

  • 在同一个目录中创建一个符号链接,这ln -s foo.so libfoo.so.1是ld将要查找的内容。

  • 现在编译一个测试程序g++ -L/directory/path test.cpp -lfoo

还会说“没有这样的文件或目录”吗?

WRT ldd输出,如果您得到这样的东西:

libsgfpamx.so => not found

它指示该.so已链接到另一个.so,该.so在库路径中找不到,因此很可能未安装。如果有理由相信这是应该可用的通用库,例如 pthreads-您可以在raspbian存储库中搜索包含该文件的软件包:

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

现在我们知道其中有几个带有这种文件名的软件包(libc6-dev和libc6:armhf)。当然,无论如何已经安装了pthreads。回到您的实际问题:

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

强烈暗示我们不走运WRT一个raspbian软件包。

在线搜索“ libsgfpamx.so”和“ sgfpamx”没有任何结果。几乎可以肯定,这些是与一起构建的深奥的或内部的东西,mylib.so如果您已经将它们放在某个地方,那么您很幸运,否则,您必须向负责“ mylib.so”的人员咨询。


我已经编辑了我的问题。
2013年

@GillesGrandguillaume:我已经在答复的末尾添加了答复。
goldilocks

所以我不明白为什么相同的示例代码可以在debian上工作……命令“ dpkg -S libsgfpamx.so”具有相同的响应。我已经编辑了我的问题。抱歉浪费您的时间。
Gilles Grandguillaume13年

-2

libsg库是Secugen库。您必须获得一个SDK并为您的平台重建它们。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.