通常当链接器找不到实际存在于路径中的库时,因为某些二进制不兼容(即大约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
答案 0 :(得分:1)
对于-lLIB
形式的参数,链接编辑器会查找名为libLIB.so
或libLIB.a
的输入文件。如果库名LIB
中有版本号,则必须提供该版本号,否则链接编辑器将无法找到它。如果版本位于 .so
之后的soname 中,则通常会添加以.so
结尾的动态链接而不使用该版本,以便链接编辑器可以找到它。 (此符号链接通常通过分发包装在-dev
或-devel
包中。)但在您的情况下,此符号链接包含之前的版本号 {{1} (虽然它不必)。
将版本号放在库名称(上面的.so
部分)中的一个优点是可以在不同版本的库之间轻松切换。