我想在函数中用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
答案 0 :(得分:0)
不可否认,我找不到任何对手册页的引用,但是在最后的链接阶段添加-lpthread
可能会完成这项工作。我通过在所有pthread_mutex_trylock
个文件中查找符号/usr/lib/lib*.a
找到了它,/usr/lib/libpthread.a
是唯一定义符号的符号。逆向工程。
gcc
的手册页确实说您可以/应该使用-pthread
gcc
选项来包含POSIX线程支持,因此这可能是皇家路线。此选项也适用于我的系统。有趣的是,常规/usr/lib/libc.a
确实提供pthread_mutex_lock
但不提供pthread_mutex_trylock
,因此引起了您的困惑。请注意,gcc
的手册页也表示此选项会对预处理产生影响,因此它可能比仅与/usr/lib/libpthread.a
链接更为优秀。