【问题标题】:g++ linking to external library creates undefined referencesg++ 链接到外部库会创建未定义的引用
【发布时间】:2017-10-03 15:19:55
【问题描述】:

我正在尝试构建一个简单的程序来测试外部库的使用,但无法将它与 g++ 链接。查看命令/结果:

user@user-Nuvo-2510VTC:~/Desktop/WDT_DIO/linux/test$ g++ -o main main.o -lwdt_dio
/usr/lib/gcc/x86_64-linux-gnu/5/../../../../lib/libwdt_dio.so: undefined reference to `sem_unlink'
/usr/lib/gcc/x86_64-linux-gnu/5/../../../../lib/libwdt_dio.so: undefined reference to `pthread_mutexattr_settype'
/usr/lib/gcc/x86_64-linux-gnu/5/../../../../lib/libwdt_dio.so: undefined reference to `sem_close'
/usr/lib/gcc/x86_64-linux-gnu/5/../../../../lib/libwdt_dio.so: undefined reference to `pthread_spin_lock'
/usr/lib/gcc/x86_64-linux-gnu/5/../../../../lib/libwdt_dio.so: undefined reference to `pthread_spin_unlock'
/usr/lib/gcc/x86_64-linux-gnu/5/../../../../lib/libwdt_dio.so: undefined reference to `pthread_create'
/usr/lib/gcc/x86_64-linux-gnu/5/../../../../lib/libwdt_dio.so: undefined reference to `pthread_spin_init'
/usr/lib/gcc/x86_64-linux-gnu/5/../../../../lib/libwdt_dio.so: undefined reference to `pthread_mutexattr_init'
/usr/lib/gcc/x86_64-linux-gnu/5/../../../../lib/libwdt_dio.so: undefined reference to `pthread_spin_destroy'
/usr/lib/gcc/x86_64-linux-gnu/5/../../../../lib/libwdt_dio.so: undefined reference to `sem_post'
/usr/lib/gcc/x86_64-linux-gnu/5/../../../../lib/libwdt_dio.so: undefined reference to `sem_open'
/usr/lib/gcc/x86_64-linux-gnu/5/../../../../lib/libwdt_dio.so: undefined reference to `sem_getvalue'
/usr/lib/gcc/x86_64-linux-gnu/5/../../../../lib/libwdt_dio.so: undefined reference to `sem_wait'
/usr/lib/gcc/x86_64-linux-gnu/5/../../../../lib/libwdt_dio.so: undefined reference to `pthread_join'
collect2: error: ld returned 1 exit status

它似乎没有链接到作为操作系统一部分的一些基本库?

详情:

gcc --version --> 5.4.0 20160609
ldd --version --> 2.23
OS            --> Ubuntu 16.04 x64, 4.8.0-36-generic kernel

【问题讨论】:

标签: c++ linux gcc


【解决方案1】:

您似乎缺少指向pthread 库的链接。将-pthread 添加到您的编译命令中:

g++ -o main main.o -pthread -lwdt_dio

检查sem_wait(3) 的手册页显示:

与 -pthread 链接。

注意:sem_wait 是随机选择的,都需要指定

【讨论】:

  • 目前还不能接受您的或 Petar 的 cmets,但您是对的。你们怎么知道缺少什么图书馆? pthread 很明显,但我没有立即认识到信号量函数是同一个库的一部分
  • @NateGreco,我对这些方法很熟悉,但以防万一我也添加了一个简单的解释......
  • 完美,谢谢
【解决方案2】:

如果您仔细阅读错误,它会说未定义来自libwdt_dio.so。它还说明了您对哪个函数有未定义的引用。

在这种特殊情况下,它是 pthread 库。它可能应该作为 WDT lib 文档中的依赖项提及。

如果您通过命令行进行编译,您可以将-pthread 添加到您的 g++ 命令中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多