遇到了一个非常诡异的事情,makefile 已经写好:
`cppflags=
headers=-I ../../inc
libs=-lpuck -L ../../lib
../bin/input: input.cpp
mkdir -p ../bin
g++ $(cppflags) $(headers) $(libs) -o $@ $^`
本来这个makefile 在centos下是没有问题的,然而在ubuntu下出现了问题,虽然已经成功链接到库文件,但是还是会有undefined reference to的错误,通常来讲,这种问题只会没有成功连接到库文件的时候才会出现,gcc/++在编译时查找库文件的顺序是:
1、-L 指定的路径, 从左到右依次查找
2、由 环境变量 LIBRARY_PATH 指定的路径,使用”:”分割从左到右依次查找
3、/etc/ld.so.conf 指定的路径顺序
4、/lib 和 /usr/lib (64位下是/lib64和/usr/lib64)
所以我这个makefile直接就满足了第一条,但还是有错误,在网上查了一下,竟然调整了一下连接选项的位置就可以了!!:
`cppflags=
headers=-I ../../inc
libs=-lpuck -L ../../lib
../bin/input: input.cpp
mkdir -p ../bin
g++ -o $@ $^ $(cppflags) $(headers) $(libs) `
不知道这是什么原因,看来是不同系统下这个gcc/++实现也是有所差距,有知道的还望指明原因。。
有一点眉目,但也不能解释现在这个问题,对于-l链接库的顺序,编译器是从右往左连接的,如果链接库之间有依赖关系,应当注意链接库的顺序,比如 库A 依赖 库B,那么写成 -lB -lA就会报错。