0

我想在函数中用 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
4

1 回答 1

0

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

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

于 2013-04-02T23:28:49.590 回答