libusb 未定义的引用

Posted

技术标签:

【中文标题】libusb 未定义的引用【英文标题】:Libusb undefined reference to 【发布时间】:2011-10-26 09:37:46 【问题描述】:

我正在尝试在我的操作系统上设置 libusb API。我在 libusb.org 上下载了 libusb api。我遵循标准安装程序:

cd into directory
./configure
make
make check //without errors
make install

然后我启动了 Eclipse C/C++ 并从网上找到的教程中复制了一些代码。但是在尝试构建它时,我得到了以下输出:

main.cpp:(.text+0x19): undefined reference to `libusb_init'
main.cpp:(.text+0x76): undefined reference to `libusb_set_debug'
main.cpp:(.text+0x8a): undefined reference to `libusb_get_device_list'
main.cpp:(.text+0x136): undefined reference to `libusb_free_device_list'
main.cpp:(.text+0x142): undefined reference to `libusb_exit'
/tmp/ccOWJGwe.o: In function `printdev(libusb_device*)':
main.cpp:(.text+0x162): undefined reference to `libusb_get_device_descriptor'
main.cpp:(.text+0x28a): undefined reference to `libusb_get_config_descriptor'
main.cpp:(.text+0x4d4): undefined reference to `libusb_free_config_descriptor'
collect2: ld returned 1 exit status

我在 /lib 中有 libusb.so,在 /usr/local/include 中有 usb.h,在 /usr/local/lib 中有 .so 和 libusb.a 的链接。

代码里面的#include也是正确的。

我知道问题出在链接器中,但我有点无法让它工作:)

我使用的是 Fedora 15 操作系统和 gcc 4.6.0 20110603 (Red Hat 4.6.0-10) 版本编译器。

那么我能做些什么来解决这些未定义的引用呢?非常感谢您的帮助:)

【问题讨论】:

请看下一个链接,它对我有用***.com/questions/10059146/gcc-libm-not-working 【参考方案1】:

我确实遇到了同样的问题。但我能够通过将“-lusb-1.0”添加到链接器来解决它。

例如:g++ myfile.cpp -lusb-1.0

【讨论】:

通常,当您系统上的 libusb.so 链接(例如 /usr/lib/x86_64-linux-gnu/libusb.so)指向不包含所需的符号,例如libusb-0.1.so.4。您可以使用 ```readlink `` 命令检查链接指向的位置。在这种情况下,可能需要调整源以查找特定版本。【参考方案2】:

您必须在链接器中设置库链接器标志以进行编译, 您可以通过执行

在控制台中获取完整列表
pkg-config --list-all

这些是您在系统上安装的库,您必须链接到您想要使用的库。 所以在你的例子中它是 libusb 所以你这样做

pkg-config --libs libusb

应该有输出

-lusb

-lusb-1.0

这为您提供了必须传递给链接器的标志。例如

g++ myfile.cpp -lusb[-1.0]

然后您编辑项目的配置并搜索链接器标志,构建选项中的某处应该有一个文本字段。我不太确定在哪里可以找到它,但建议使用谷歌搜索:

Project -> Properties -> C/C++
Build -> Miscellaneous -> flags

找到后,只需在文本字段中添加链接器标志就可以了。

编辑

因为我的答案是被接受的,所以我还添加了另一个似乎对很多人有用的标志。

【讨论】:

是的,非常感谢 :) 我按照您的命令进行操作,现在可以了。此外,我对如何将 .so 库链接到 gcc 编译器有更好的概述,因为我现在用 Java 编程,但我现在不知道如何做到这一点。我的图书馆标志是 -lusb-1.0 唯一的区别 编译 Heimdall,出现错误,按照此说明编辑 heimdall/CMakeFiles/heimdall.dir/link.txt 添加 -lusb-1.0。【参考方案3】:

你的链接器命令行是什么?您需要在链接命令中有-lusb;仅仅包含标题是行不通的。

【讨论】:

我试过了,但我不知道如何获得 -lusb 标志 :) 但 Xtroce 告诉我,现在它可以工作了:) 谢谢你的帮助:)【参考方案4】:

我不使用 Eclipse C/C++,但我很确定原因与我前段时间在 Netbeans 中设置 C 项目时遇到的相同。

在您的代码和库中的正确位置包含#include 是不够的——您还必须告诉 Eclipse 在哪里查找它们以及如何使用它们。 This turorial 向您展示了如何在 Eclipse 中进行设置。

【讨论】:

这是 OP 没有链接到库的事实,而不是找不到标头的事实。这是 ld 未定义的引用错误,而不是 gcc 缺少标头错误。 当然。但我指的是 Eclipse 的一般原则。 gcc 的 C 预处理器,被 Eclipse 使用,默认情况下至少在 /usr/include 中查找头文件,因此头文件几乎从来不是问题。

以上是关于libusb 未定义的引用的主要内容,如果未能解决你的问题,请参考以下文章

编译错误 未定义的引用 怎么回事

无法设置未定义或null引用的属性“onclick”

C语言里面对啥未定义引用是啥意思?

错误: - 未定义引用 `_imp__GetStockObject@4' 和未定义引用 `_imp__SetBkMode@8'

未捕获的引用错误 - 未定义函数

来自 libusb 的错误消息“未声明接口”