redis2.3.7安装时出现undefined reference to `clock_gettime'

(转自:http://blog.csdn.net/qq_28779503/article/details/54844988)

undefined reference to `clock_gettime' 链接错误的解决思路

错误信息:

centos下安装Redis时报错,报错内容为:

 

[plain] view plain copy
 
 在CODE上查看代码片派生到我的代码片
  1. /home/wm/redis-3.2.7/deps/jemalloc/src/nstime.c:120: undefined reference to `clock_gettime'  

发现是在链接的时候出错。经过查找发现clock_gettime在实时库librt(real time)里面,由于链接的时候没有链接这个库导致报错。

 

 

解决思路:

只需在我们运行的Makefile文件里面添加动态链接库librt ( -lrt )  ,重新编译即可。

 

解决方案:

1.查找实时库librt所在路径:

 

[plain] view plain copy
 
 在CODE上查看代码片派生到我的代码片
  1. [root@localhost redis-3.2.7]# find / -name '*librt*'  
  2. /lib/librt-2.12.so  
  3. /lib/i686/nosegneg/librt-2.12.so  
  4. /lib/i686/nosegneg/librt.so.1  
  5. /lib/librt.so.1  
  6. /lib/rtkaio/librtkaio-2.12.so  
  7. /lib/rtkaio/i686/nosegneg/librtkaio-2.12.so  
  8. /lib/rtkaio/i686/nosegneg/librt.so.1  
  9. /lib/rtkaio/librt.so.1  
  10. /usr/lib/librt.so  
  11. /usr/lib/pulse-0.9.21/modules/librtp.so  

 

 

2.推测可知:librt.so为linkname,librt.so.1为soname,librt-2.12.so为realname

 

[plain] view plain copy
 
 在CODE上查看代码片派生到我的代码片
  1. [root@localhost redis-3.2.7]# ls -l /usr/lib/ |grep 'librt.so'  
  2. lrwxrwxrwx.  1 root root       20 7月  18 2016 librt.so -> ../../lib/librt.so.1  
  3. [root@localhost redis-3.2.7]# ls -l /lib/ |grep 'librt.so.1'  
  4. lrwxrwxrwx.  1 root root      13 7月  13 2016 librt.so.1 -> librt-2.12.so  

 

 


3.打开/home/wm/redis-3.2.7路径下的Makefile文件:

 

[sql] view plain copy
 
 在CODE上查看代码片派生到我的代码片
  1. vim /home/wm/redis-3.2.7/Makefile  
文件内容:

 

 

[plain] view plain copy
 
 在CODE上查看代码片派生到我的代码片
  1.  1 # Top level makefile, the real shit is at src/Makefile  
  2.  2  
  3.  3 default: all  
  4.  4  
  5.  5 .DEFAULT:  
  6.  6     cd src && $(MAKE) $@  
  7.  7  
  8.  8 install:  
  9.  9     cd src && $(MAKE) $@  
  10. 10  
  11. 11 .PHONY: install  

由注释可知:

 

这个Makefile是顶级的Makefile文件,真正的Makefile文件在src/ makefile路径下

 

4.打开/home/wangmao/redis-3.2.7/src/路径下的Makefile文件:

 

[plain] view plain copy
 
 在CODE上查看代码片派生到我的代码片
  1. vim /home/wangmao/redis-3.2.7/src/Makefile  

 

 

从错误信息可知,该错误是编译/home/wm/redis-3.2.7/deps/jemalloc/src/nstime.c文件中的clock_gettime函数时未找到相应的动态链接库而发生的错误。

阅读Makefile文件后可推测应与jemalloc文件夹相关,所以:

 

[plain] view plain copy
 
 在CODE上查看代码片派生到我的代码片
  1. 105 ifeq ($(MALLOC),jemalloc)  
  2. 106     DEPENDENCY_TARGETS+= jemalloc  
  3. 107     FINAL_CFLAGS+= -DUSE_JEMALLOC -I../deps/jemalloc/include  
  4. 108     FINAL_LIBS+= ../deps/jemalloc/lib/libjemalloc.a  
  5. 109     FINAL_LIBS+= /usr/lib/librt.so  #此路径加上librt.so  
  6. 110 endif  

 

 


5.保存Makefile文件后,重新执行Make命令即可成功编译。

 

另:附上Linux常用的库

libz     压缩库(Z)
librt     实时库(real time)
libm    数学库(math)
libc     标准C库(C lib)

 

posted @ 2017-02-04 10:53  玉曲风  阅读(368)  评论(0编辑  收藏  举报