C 为什么我得到对pthread_mutexattr_settype的未定义引用?

C 为什么我得到对pthread_mutexattr_settype的未定义引用?,c,linux,gcc,shared-libraries,linker-errors,C,Linux,Gcc,Shared Libraries,Linker Errors,我正在尝试编译和链接Novell LDAP C SDK中的一个示例文件,但由于pthread库中有3个未解析的符号,链接失败。我在Ubuntu13.10(俏皮)上使用GCC4.8.1。我已经正确地将pthread库作为命令行上的最后一个库包含在内,但是这些特定的符号仍然没有被解析 $ gcc -Wl,-trace-symbol=pthread_mutexattr_settype -Wl,-trace-symbol=pthread_mutexattr_init -Wl,-trace-symbo

我正在尝试编译和链接Novell LDAP C SDK中的一个示例文件,但由于
pthread
库中有3个未解析的符号,链接失败。我在Ubuntu13.10(俏皮)上使用GCC4.8.1。我已经正确地将
pthread
库作为命令行上的最后一个库包含在内,但是这些特定的符号仍然没有被解析

$ gcc -Wl,-trace-symbol=pthread_mutexattr_settype -Wl,-trace-symbol=pthread_mutexattr_init   -Wl,-trace-symbol=pthread_mutex_trylock  -o search search.o -L../lib -lldapsdk -lpthread

../lib/libldapsdk.so: reference to pthread_mutexattr_settype<br>
../lib/libldapsdk.so: reference to pthread_mutexattr_init<br>
../lib/libldapsdk.so: reference to pthread_mutex_trylock<br>
/lib/i386-linux-gnu/libpthread.so.0: definition of pthread_mutexattr_settype<br>
/lib/i386-linux-gnu/libpthread.so.0: definition of pthread_mutexattr_init<br>
/lib/i386-linux-gnu/libpthread.so.0: definition of pthread_mutex_trylock<br>
../lib/libldapsdk.so: undefined reference to pthread_mutexattr_settype<br>
../lib/libldapsdk.so: undefined reference to pthread_mutex_trylock<br>
../lib/libldapsdk.so: undefined reference to pthread_mutexattr_init<br>
collect2: error: ld returned 1 exit status

$ readelf --all  /lib/i386-linux-gnu/libpthread.so.0|grep pthread_mutexattr_settype<br>
   114: 00009d90    36 FUNC    GLOBAL DEFAULT   13 pthread_mutexattr_settype@@GLIBC_2.1<br>
   493: 00009d90    36 FUNC    GLOBAL DEFAULT   13 pthread_mutexattr_settype
$gcc-Wl,-trace symbol=pthread\u mutexattr\u settype-Wl,-trace symbol=pthread\u mutexattr\u init-Wl,-trace symbol=pthread\u mutex\u trylock-o search search.o-L../lib-lldapsdk-lpthread
../lib/libldapsdk.so:对pthread_mutexattr_settype的引用
../lib/libldapsdk.so:对pthread_mutexattr_init的引用
../lib/libldapsdk.so:对pthread\u mutex\u trylock的引用
/lib/i386 linux gnu/libpthread.so.0:pthread_mutexttr_settype的定义
/lib/i386 linux gnu/libpthread.so.0:pthread_mutexttr_init的定义
/lib/i386 linux gnu/libpthread.so.0:pthread\u mutex\u trylock的定义
../lib/libldapsdk.so:对pthread_mutexattr_settype的未定义引用
../lib/libldapsdk.so:对pthread\u mutex\u trylock的未定义引用
../lib/libldapsdk.so:对pthread_mutexattr_init的未定义引用
collect2:错误:ld返回了1个退出状态 $readelf--all/lib/i386 linux gnu/libpthread.so.0|grep pthread_mutexttr_settype
114:00009d90 36 FUNC全局默认值13 pthread_mutexattr_settype@@GLIBC_2.1
493:00009d90 36 FUNC全局默认值13 pthread_mutexattr_settype
只是写下评论作为回答,因为根据其他用户的反馈,它被证明是有帮助的



请将
-pthread
传递给编译器(不带
-l
)。另见

在cmake中,您可以添加
set(cmake\u CXX\u标志“-pthread”)


不要编辑间距

请尝试将
-pthread
传递给编译器(不带
-l
)。你也看到了,这就成功了!谢谢好啊很高兴听到有帮助@阿里:你应该回答这个问题。阿里补充了他的评论作为回答,所以可能会接受它,因为它似乎回答了你的问题。为什么?
-pthread
-lphread
之间有什么区别?不过,谢谢你的解决方案,它对我也很有效。很有魅力。谢谢:)在我的例子中,我使用了set(CMAKE_C_FLAGS“-pthread”)。。。它解决了我的头痛。梅林的胡子!!!