libusb在路径中,但链接器找不到它

时间:2018-06-08 19:04:02

标签: gcc linker

通常当链接器找不到实际存在于路径中的库时,因为某些二进制不兼容(即大约32/64位)。 在我的情况下,它似乎有所不同,我没有找到回答这个问题的问题。

Rapsberry Pi 3B +,Raspbian Stretch Lite,尝试编译用于​​3DTouchPad的Microchip SDK。

编译以这种方式失败:

mkdir -p build/bin
gcc -o build/bin/2draw build/2draw/2draw.o  -Lbuild/bin -lmchp_hmi -L/lib/arm-linux-gnueabihf/ -lusb -Wl,-rpath,\$ORIGIN -lcurses
/usr/bin/ld: cannot find -lusb
collect2: error: ld returned 1 exit status
Makefile:125: recipe for target 'build/bin/2draw' failed
make: *** [build/bin/2draw] Error 1

这里有关于“缺失”库的详细信息:

$ ldconfig -p | grep libusb
    libusb-1.0.so.0 (libc6,hard-float) => /lib/arm-linux-gnueabihf/libusb-1.0.so.0
    libusb-1.0.so (libc6,hard-float) => /usr/lib/arm-linux-gnueabihf/libusb-1.0.so
    libusb-0.1.so.4 (libc6,hard-float) => /lib/arm-linux-gnueabihf/libusb-0.1.so.4

$ file /lib/arm-linux-gnueabihf/libusb-1.0.so.0.1.0 
/lib/arm-linux-gnueabihf/libusb-1.0.so.0.1.0: ELF 32-bit LSB shared object, ARM, EABI5 version 1 (SYSV), dynamically linked, BuildID[sha1]=a93e56d2846806b7adc76e674493c76e54e3ca9e, stripped

这对我来说似乎没问题。我用sudo apt-get install libusb-1.0-0-dev安装了它。

是否还有其他原因阻止链接器查找现有库?

修改

有趣的......甚至我无法推断原因。

$ ld -lusb --verbose
GNU ld (GNU Binutils for Raspbian) 2.28
  Supported emulations:
   armelf_linux_eabi
   armelfb_linux_eabi

==================================================
attempt to open //usr/local/lib/arm-linux-gnueabihf/libusb.so failed
attempt to open //usr/local/lib/arm-linux-gnueabihf/libusb.a failed
attempt to open //lib/arm-linux-gnueabihf/libusb.so failed
attempt to open //lib/arm-linux-gnueabihf/libusb.a failed
attempt to open //usr/lib/arm-linux-gnueabihf/libusb.so failed
attempt to open //usr/lib/arm-linux-gnueabihf/libusb.a failed
attempt to open //usr/local/lib/libusb.so failed
attempt to open //usr/local/lib/libusb.a failed
attempt to open //lib/libusb.so failed
attempt to open //lib/libusb.a failed
attempt to open //usr/lib/libusb.so failed
attempt to open //usr/lib/libusb.a failed
attempt to open //usr/arm-linux-gnueabihf/lib/libusb.so failed
attempt to open //usr/arm-linux-gnueabihf/lib/libusb.a failed
ld: cannot find -lusb

1 个答案:

答案 0 :(得分:1)

对于-lLIB形式的参数,链接编辑器会查找名为libLIB.solibLIB.a的输入文件。如果库名LIB中有版本号,则必须提供该版本号,否则链接编辑器将无法找到它。如果版本位于 .so之后的soname 中,则通常会添加以.so结尾的动态链接而不使用该版本,以便链接编辑器可以找到它。 (此符号链接通常通过分发包装在-dev-devel包中。)但在您的情况下,此符号链接包含之前的版本号 {{1} (虽然它不必)。

将版本号放在库名称(上面的.so部分)中的一个优点是可以在不同版本的库之间轻松切换。