zoukankan      html  css  js  c++  java
  • 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)

  • 相关阅读:
    Linux命令基础
    ubuntu16.04修改ssh的端口
    ubuntu16.04没有办法使用CRT,或者SSH工具的解决办法
    如何启动、关闭和设置ubuntu防火墙
    ubuntu远程桌面软件vnc。
    CAD安装激活失败的原因
    如何调出电脑的任务管理器
    如何查看Windows10连接的WiFi密码
    如何知道和你在一个局域网的电脑个数?
    如何快速连上另一台电脑已共享的打印机
  • 原文地址:https://www.cnblogs.com/LvLoveYuForever/p/6364267.html
Copyright © 2011-2022 走看看