StF*_*tFS 4 ubuntu linker gcc makefile ld
我们正在尝试在需要libusb的Ubuntu盒子上编译一些代码,但是当它试图链接它时我们不断得到"未定义的引用"错误.
有问题的代码就是这个:https: //gitorious.org/minibox-dcdcusb/minibox-dcdcusb
它需要libusb所以我安装:
apt-get install libusb libusb-dev
Run Code Online (Sandbox Code Playgroud)
然后我运行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
Run Code Online (Sandbox Code Playgroud)
我已经验证pkg-config报告了正确的配置参数:
? minibox-dcdcusb git:(master) ? pkg-config --libs libusb
-lusb
Run Code Online (Sandbox Code Playgroud)
我已经确定二进制文件应该是它们应该是的位置:
? 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
Run Code Online (Sandbox Code Playgroud)
而且我甚至确保链接器似乎抱怨的引用实际上在libusb二进制文件中:
(剧透:链接器抱怨的所有符号似乎都在那里)
最后,我使用-Wl运行compile命令, - 详细查看链接器正在拾取的二进制文件,看起来它实际上正在拾取正确的二进制文件,但它无法链接它们.这是输出:
我很遗憾这里可能出现什么问题?为什么链接器不能链接到libusb?
为什么链接器不能链接到libusb?
它能够,但是当链接器看到该库时,它没有对libusb中的符号进行任何未定义的引用,所以它只是继续并忽略它.后来链接器看到了libdcdc-usb,它对libusb中的符号有未定义的引用,但是到那时已经太晚了,链接器已经关闭了libusb并停止查看它.
正如评论所说,链接器参数的顺序很重要,但评论建议更早地移动它们,这是错误的方式.
事实上,我在某处读到链接器信息应该在需要该库的源参数之后.
它不仅仅是"源文件之后的链接器参数",您需要对库进行排序,以便提供符号定义的库位于需要这些定义的对象之后.
libdcdc-usb取决于libusb所以libusb必须稍后,所以将pkg-config呼叫转移到最后.
| 归档时间: |
|
| 查看次数: |
5446 次 |
| 最近记录: |