来自同一个库的两个函数:为什么一个生成未定义的引用而另一个不生成?

时间:2013-04-02 22:59:10

标签: c compiler-construction linker

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

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链接更为优秀。