热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

ubuntu下没有pthread库以及报undefinedreferenceto'pthread_create'的解决方法

最近在Ubuntu下编译一个程序,需要使用多线程库pthread,但是编译时总是提示“undefinedreferencetopthread_create”的错误,如下图所示:要解决这个问题

最近在Ubuntu下编译一个程序,需要使用多线程库pthread,但是编译时总是提示“undefined reference to 'pthread_create'”的错误,如下图所示:


要解决这个问题非常简单 。先说怎么解决。

如果你使用的是gcc编译,或者将编译命令都写到makefile文件中了,例如我的makefile文件为:

[plain] view plain copy print?在CODE上查看代码片派生到我的代码片
  1. all:  
  2.     gcc -g -Wall   -I/usr/local/include -o transmitter transmitter.c IniFileRW.c  -lpthread   
  3.       
  4. clean:  
  5.     rm -rf *.o transmitter  
那么这时候只要在最后面加上-lpthread就可以了,而且在redhat5中-lpthread可以加在-Wall的后面,但是在Ubuntu下必须加在最后才行。

如果你用的是eclipse,并makefile是由eclipse自动生成的,那么你要在eclipse下配置一下。方法是右击eclipse工程文件,选择属性->C/C++Setting->在右侧栏中选择“tool Settings”->GCC linker->在library中做如下设置,然后重新编译就行了。


如果上面的方法还是不起作用,可能是你的系统的动态库有问题。这时候需要配置系统库了。且听我慢慢道来。

一般 Linux 系统把 /lib 和 /usr/lib 两个目录作为默认的库搜索路径,所以使用这两个目录中的库时不需要进行设置搜索路径即可直接使用。对于处于默认库搜索路径之外的库,需要将库的位置添加到 库的搜索路径之中。在系统的lib目录下是有thread共享库文件的。在早期的Ubuntu系统中,lib只要设置/lib和/usr/lib就可以了,但是Ubuntu14中, lib库的分类明显多了,主要是区分32位和64位的库。在/etc/ld.so.conf.d下可以看到几个与共享库有关的配置文件。例如i686-linux-gnu.conf文件的内容为:

[plain] view plain copy print?在CODE上查看代码片派生到我的代码片
  1. /lib/i386-linux-gnu  
  2. /usr/lib/i386-linux-gnu  
  3. /lib/i686-linux-gnu  
  4. /usr/lib/i686-linux-gnu  
其中i386和i686都是32位系统的,而x86_64是64位系统的。打开x86_64-linux-gnu.conf可以看到里面的内容为:

[plain] view plain copy print?在CODE上查看代码片派生到我的代码片
  1. # Multiarch support  
  2. /lib/x86_64-linux-gnu  
  3. /usr/lib/x86_64-linux-gnu  
很明显,这里是将32位和64位系统的文件进行了区分。如果在eclipse下编译遇到找上面的问题,就需要手动指定路径了。

为了解决undefined reference to “pthread_create“的问题,一般有三种方法:

第一种:检查共享库配置文件.检查/etc/ld.so.conf.d下对应的文件是否将共享库的路径加入进来,如果没有就加上。 还要使用 /sbin/ldconfig命令来更新一下/etc/ld.so.cache 文件。

第二种:设置环境变量 LD_LIBRARY_PATH ,方法是: export LD_LIBRARY_PATH=/opt/gtk/lib:$LD_LIBRARY_PATH(红色部分修改成你所指定的路径) 可以用下面的命令查看 LD_LIBRAY_PATH 的设置内容:
echo $LD_LIBRARY_PATH
最近没有自己写共享库,所以上述两种方法我没有验证过。一般而言,为了管理方便,我们会将自己写的程序编译到/usr/local/下,这时候系统是找不到的,必须通过上述方法来设置。 第三种:直接在编译时指定,命令是在gcc时加上 -L/usr/local/lib,而在eclipse中,可以按照上面图示直接添加进来。不过以前使用openssl进行该操作时,编译能生成可执行程序,运行时还是会提示找不到共享库,所以还是前面两个方法要好一些。 第四种:前面说了,Ubuntu能自动检索/usr/lib和/lib目录,直接将你的共享库编译到其中一个目录下就行了。不过在开发过程中建议不要这么做,不然自己都会乱。
推荐阅读
author-avatar
花神
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有