在Ubuntu上链接libusb不会';行不通

在Ubuntu上链接libusb不会';行不通,ubuntu,gcc,linker,makefile,ld,Ubuntu,Gcc,Linker,Makefile,Ld,我们试图在一个需要libusb的Ubuntu盒上编译一些代码,但是当它试图链接到libusb时,我们不断得到“未定义的引用”错误 问题代码如下: 它需要libusb,因此我安装: apt-get install libusb libusb-dev 然后我运行make并得到以下错误: ➜ minibox-dcdcusb git:(master) ✗ make cc -Wall main.c -o dcdc-usb `pkg-config --libs

我们试图在一个需要libusb的Ubuntu盒上编译一些代码,但是当它试图链接到libusb时,我们不断得到“未定义的引用”错误

问题代码如下:

它需要libusb,因此我安装:

apt-get install libusb libusb-dev
然后我运行make并得到以下错误:

➜  minibox-dcdcusb git:(master) ✗ make                    
cc -Wall  main.c -o dcdc-usb `pkg-config --libs libusb` -lm -L. -ldcdc-usb
./libdcdc-usb.so: undefined reference to `usb_get_driver_np'
./libdcdc-usb.so: undefined reference to `usb_interrupt_read'
./libdcdc-usb.so: undefined reference to `usb_find_busses'
./libdcdc-usb.so: undefined reference to `usb_find_devices'
./libdcdc-usb.so: undefined reference to `usb_set_configuration'
./libdcdc-usb.so: undefined reference to `usb_interrupt_write'
./libdcdc-usb.so: undefined reference to `usb_control_msg'
./libdcdc-usb.so: undefined reference to `usb_set_altinterface'
./libdcdc-usb.so: undefined reference to `usb_init'
./libdcdc-usb.so: undefined reference to `usb_set_debug'
./libdcdc-usb.so: undefined reference to `usb_open'
./libdcdc-usb.so: undefined reference to `usb_claim_interface'
./libdcdc-usb.so: undefined reference to `usb_detach_kernel_driver_np'
./libdcdc-usb.so: undefined reference to `floor'
./libdcdc-usb.so: undefined reference to `usb_get_busses'
collect2: error: ld returned 1 exit status
make: *** [dcdc-usb] Error 1
我已验证pkg config是否报告了正确的配置参数:

➜  minibox-dcdcusb git:(master) ✗ pkg-config --libs libusb
-lusb  
我已经确定了二进制文件的位置:

➜  minibox-dcdcusb git:(master) ✗ ls -l /usr/lib/x86_64-linux-gnu/libusb*
lrwxrwxrwx 1 root root    37 des  3 13:58 /usr/lib/x86_64-linux-gnu/libusb-0.1.so.4 -> /lib/x86_64-linux-gnu/libusb-0.1.so.4
-rw-r--r-- 1 root root 42998 des  3 13:58 /usr/lib/x86_64-linux-gnu/libusb.a
lrwxrwxrwx 1 root root    41 des  3 13:58 /usr/lib/x86_64-linux-gnu/libusb.so -> /lib/x86_64-linux-gnu/libusb-0.1.so.4.4.4
我甚至确保链接器似乎抱怨的引用实际上在libusb二进制文件中:

(扰流板:链接器抱怨的所有符号似乎都在那里)

最后,我使用-Wl,--verbose运行了compile命令,以查看链接器拾取的到底是什么二进制文件,看起来它实际上拾取的是正确的二进制文件,但它无法与它们进行链接。这是它的输出:

我完全不知道这里可能有什么问题?为什么链接器不能链接到libusb

为什么链接器不能链接到libusb

它可以,但当链接器看到该库时,它在libusb中没有任何未定义的符号引用,所以它只是继续并忽略它。稍后链接器会看到libdcdc-usb,它对libusb中的符号有未定义的引用,但现在已经太迟了,链接器已经关闭libusb并停止查看它

正如该评论所说,链接器参数的顺序很重要,但该评论建议将其提前,这是错误的

事实上,我在某个地方读到链接器信息应该在需要该库的源参数之后

不仅仅是“源文件后的链接器参数”,还需要对库进行排序,以便提供符号定义的库位于需要这些定义的对象之后


libdcdc-usb
取决于
libusb
,因此
libusb
必须稍后才能出现,因此将
pkg-config
调用移到末尾。

gcc的参数顺序可能会有影响。如果将pkg config调用放在源参数和输出参数之前,是否有效。。。我已经试过了,现在再次验证,这没有任何效果。事实上,我在某个地方读到链接器信息应该出现在需要该库的源参数之后。我永远记不起是哪个顺序,我只知道它有时会导致问题。实际上我注意到这是在抱怨库中的符号,而不是二进制。你可能需要
-Wl,-E
在这里从二进制文件中导出符号,因为你没有动态链接libusb。该死的!我也不得不移动-lm,但在那之后它就可以工作了!非常感谢。这是因为其他lib依赖于
libm
,而不依赖于它们。