(转自:http://blog.csdn.net/qq_28779503/article/details/54844988)
undefined reference to `clock_gettime' 链接错误的解决思路
错误信息:
centos下安装Redis时报错,报错内容为:
- /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所在路径:
- [root@localhost redis-3.2.7]# find / -name '*librt*'
- /lib/librt-2.12.so
- /lib/i686/nosegneg/librt-2.12.so
- /lib/i686/nosegneg/librt.so.1
- /lib/librt.so.1
- /lib/rtkaio/librtkaio-2.12.so
- /lib/rtkaio/i686/nosegneg/librtkaio-2.12.so
- /lib/rtkaio/i686/nosegneg/librt.so.1
- /lib/rtkaio/librt.so.1
- /usr/lib/librt.so
- /usr/lib/pulse-0.9.21/modules/librtp.so
2.推测可知:librt.so为linkname,librt.so.1为soname,librt-2.12.so为realname
- [root@localhost redis-3.2.7]# ls -l /usr/lib/ |grep 'librt.so'
- lrwxrwxrwx. 1 root root 20 7月 18 2016 librt.so -> ../../lib/librt.so.1
- [root@localhost redis-3.2.7]# ls -l /lib/ |grep 'librt.so.1'
- lrwxrwxrwx. 1 root root 13 7月 13 2016 librt.so.1 -> librt-2.12.so
3.打开/home/wm/redis-3.2.7路径下的Makefile文件:
- vim /home/wm/redis-3.2.7/Makefile
- 1 # Top level makefile, the real shit is at src/Makefile
- 2
- 3 default: all
- 4
- 5 .DEFAULT:
- 6 cd src && $(MAKE) $@
- 7
- 8 install:
- 9 cd src && $(MAKE) $@
- 10
- 11 .PHONY: install
由注释可知:
这个Makefile是顶级的Makefile文件,真正的Makefile文件在src/ makefile路径下
4.打开/home/wangmao/redis-3.2.7/src/路径下的Makefile文件:
- vim /home/wangmao/redis-3.2.7/src/Makefile
阅读Makefile文件后可推测应与jemalloc文件夹相关,所以:
- 105 ifeq ($(MALLOC),jemalloc)
- 106 DEPENDENCY_TARGETS+= jemalloc
- 107 FINAL_CFLAGS+= -DUSE_JEMALLOC -I../deps/jemalloc/include
- 108 FINAL_LIBS+= ../deps/jemalloc/lib/libjemalloc.a
- 109 FINAL_LIBS+= /usr/lib/librt.so #此路径加上librt.so
- 110 endif
5.保存Makefile文件后,重新执行Make命令即可成功编译。
另:附上Linux常用的库
libz 压缩库(Z)
librt 实时库(real time)
libm 数学库(math)
libc 标准C库(C lib)