【问题标题】:Two functions from the same library: why does one generate undefined reference while the other doesn't?来自同一个库的两个函数:为什么一个生成未定义的引用而另一个不生成?
【发布时间】:2013-04-02 22:59:10
【问题描述】:

我想在函数中用 pthread_mutex_trylock 替换 pthread_mutex_lock,当我这样做时,我收到“未定义的引用”错误消息(见下文)。如果我用 pthread_mutex_lock(&cmd_queue_lock) 替换第 411-13 行,我不会收到链接器错误。

它们都来自我已经包含的同一个库。为什么一个会产生链接器错误而另一个不会?更重要的是,我该如何解决它?我尝试添加“extern int pthread_mutex_trylock”并更改 Makefile 中 .o 文件的顺序,但都不起作用。

$ nl clientmain.c

    12  #include <stdio.h>
    ...
    21  #include <pthread.h>

    411 if (pthread_mutex_trylock(&cmd_queue_lock) == EBUSY) {
    412     continue;
    413 }

$ make
clientmain.o: In function `createHC':
clientmain.c:411: undefined reference to `pthread_mutex_trylock'
collect2: ld returned 1 exit status
make: *** [clientmain] Error 1

【问题讨论】:

  • 显示实际的链接器命令行。

标签: c compiler-construction linker


【解决方案1】:

诚然,我找不到任何参考手册页来说明这一点,但将-lpthread 添加到您的最终链接阶段可能会完成这项工作。我通过在所有 /usr/lib/lib*.a 文件中查找符号 pthread_mutex_trylock 找到了它,而 /usr/lib/libpthread.a 是唯一定义该符号的符号。逆向工程。

gcc 的手册页确实说您可以/应该使用-pthread 选项到gcc 来包含 POSIX 线程支持,所以这可能是王道。这个选项也适用于我的系统。有趣的是,常规的/usr/lib/libc.a 确实提供了pthread_mutex_lock,但没有提供pthread_mutex_trylock,所以这引起了你的困惑。请注意,gcc 的手册页也说此选项对预处理有影响,因此它可能比仅链接 /usr/lib/libpthread.a 更好。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-12-29
    • 2015-04-15
    • 1970-01-01
    • 2016-02-20
    • 1970-01-01
    • 1970-01-01
    • 2021-04-07
    • 1970-01-01
    相关资源
    最近更新 更多