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

我想在函数中用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  ... 21 #include  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 

不可否认,我找不到任何对手册页的引用,但是在最后的链接阶段添加-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更好,更好。