对“pthread_mutex_trylock”的未定义引用
Posted
技术标签:
【中文标题】对“pthread_mutex_trylock”的未定义引用【英文标题】:undefined reference to `pthread_mutex_trylock' 【发布时间】:2010-01-05 22:32:02 【问题描述】:我有以下测试程序。
#include <iostream>
#include <cstdlib>
using namespace std;
pthread_mutex_t mymutex = PTHREAD_MUTEX_INITIALIZER;
int main(int argc, char *argv[])
int iret;
iret = pthread_mutex_trylock( & mymutex );
cout << "Test2 !!! " << endl;
pthread_mutex_unlock( & mymutex );
return EXIT_SUCCESS;
如果我在不添加 pthread 库的情况下编译它,我会收到 pthread_mutex_trylock 未解决错误的错误,但仅适用于函数 pthread_mutex_trylock。
如果我将 pthread_mutex_trylock 替换为 pthread_mutex_trylock,则程序在没有 -lpthread* 选项的情况下也能很好地编译和运行。
如果我将 -lpthraed 选项添加到编译命令中,所有运行良好 这运行良好:$ g++ test2.c -o test2 -lpthread 此警告未解决:$ g++ test2.c -o test2
错误输出示例:
$ g++ test2.c -o test2
/tmp/ccU1bBdU.o:在函数main':
test2.c:(.text+0x11): undefined reference to
pthread_mutex_trylock'
collect2: ld 返回 1 个退出状态
如果我替换指令 iret = pthread_mutex_trylock( & mymutex );
使用 iret = pthread_mutex_lock( & mymutex ); 如果没有将 pthread 库添加到编译命令中,程序也会编译并运行而不会出错 我知道如果我不使用 -lpthread 选项,出现未解决的错误是正确的,但为什么其他 pthread_ 函数也没有相同的未解决错误?
我在 fedora 12 上使用 gcc 4.4.2
$ g++ --version
g++ (GCC) 4.4.2 20091222 (Red Hat 4.4.2-20)
Copyright (C) 2009 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
是否有人对仅针对 pthread_mutex_trylock 的取消引用的含义有一些建议?
感谢恩佐的帮助
【问题讨论】:
这可能是一些特定于平台的行为,但你为什么还要打扰呢?您应该与 pthread 链接,就这样做吧。 我还是有学习的意愿:) 尽管如此,这个问题在像我这样的情况下很有用,在这种情况下,对pthread_mutex_lock()
的调用被 pthread_mutex_trylock()
取代,导致事情无缘无故地中断。
【参考方案1】:
如果您使用 pthread 函数,您应该将您的目标文件与-lpthread
链接起来,而不用担心符号是否包含在libc
中。
这背后的基本原理是said 是这样的:前一段时间,当使用线程的应用程序在没有线程支持的系统上运行时,会使用 libc 中的存根。在这样的系统上,pthread_*
函数链接到 libc
存根,该存根返回的错误表明没有线程功能。在“线程”系统上,它们链接到 pthread
库并正常工作。
显然,pthread_mutex_trylock
函数是在策略更改为与-lpthread
链接后出现的。所以没有存根。
【讨论】:
感谢 Pavel,现在这种奇怪的行为我更清楚了。问候,ebzo 顺便说一句,-lpthread
不可移植,尤其是旧版本的 BSD 使用 libc_r
,而不是 libpthread
。因此,-pthread
更便携,更值得推荐。【参考方案2】:
您应该使用-pthread
选项执行编译和链接,以便可移植。在某些系统上,编译会添加特定的标志(例如,-D_REENTRANT
)并指定-pthread
。
如果您想知道-pthread
会对您的编译和链接标志做什么,请运行gcc -dumpspecs
。
【讨论】:
以上是关于对“pthread_mutex_trylock”的未定义引用的主要内容,如果未能解决你的问题,请参考以下文章