因为要用到POSIX的定时器,编译时要动态链接librt(glibc的实时动态库)。
makefile链接时需要添加-lrt参数:
gcc -lrt a.o,b.o............. -o my_program
这个makefile在本地机器上运行得好好的,系统是Ubuntu 11.04 Desktop。
但是在服务器上就出现如下错误:
my_timer.o: In function `init_my_timer':
my_timer.c:(.text+0x1bb): undefined reference to `timer_create'
my_timer.o: In function `cancel_my_timer':
my_timer.c:(.text+0x220): undefined reference to `timer_settime'
my_timer.o: In function `start_my_timer':
my_timer.c:(.text+0x255): undefined reference to `timer_settime'
my_timer.o: In function `restart_my_timer':
my_timer.c:(.text+0x28a): undefined reference to `timer_settime'
collect2: ld returned 1 exit status
make: *** [my_program] Error 1
很明显是librt没有链接上!非常奇怪,服务器是 Linux ubuntu-wfms-slaver-02 3.0.0-15-server
但是用 ldconfig -p 查看所有的动态库,看见是有librt的:
librt.so.1 (libc6,x86-64, OS ABI: Linux 2.6.15) => /lib/x86_64-linux-gnu/librt.so.1
librt.so (libc6,x86-64, OS ABI: Linux 2.6.15) => /usr/lib/x86_64-linux-gnu/librt.so
对这个问题非常不解!
偶然尝试将 -lrt 参数放在最后面:
gcc a.o,b.o............. -o my_program -lrt
结果就成功了~ 不太明白为什么参数的位置会有影响。