CFLAGS/CXXFLAGS/LDFLAGS和gcc的关系
多年的实践经验里面我们经常使用这些变量来和编译器配合使用,来控制编译器的行为。
今天想当然的以为他们是自动配合的,即:
- 在环境变量里面设置CFLAGS的值
$ export CFLAGS=... - 运行gcc,会自动识别和应用CFLAGS
$ gcc main.c
结果根本不是这样的,所有的CFLAGS都直接被忽略。
因为CFLAGS/CXXFLAGS/LDFLAGS是一种约定成俗,就像定义任何环境变量一样,都必须在gcc命令行中显示的指定,否则都是无效的。
例如:
$ export CFLAGS="-O2"
$ gcc main.c
和
$ export HAHAHA="-O2"
$ gcc main.c
这两个行为对编译器来说效果是一样的,编译器gcc根本不访问你定义的任何环境变量,如果要使用,则必须:
gcc ${CFLAGS} main.c
或者
gcc ${HAHAHA} main.c
两个效果是一样的,差异就是习惯,当人们普遍认为都知道${CFLAGS}是用来定义编译器的编译选项,${LDFLAGS}是用来定义编译器的链接选项,上述命令行显得可读性可维护性比较强。而如果你非要用HAHAHA,也可以,只是后来人看起来就会觉得怪怪的哈。
结论就是:
编译器gcc并不会主动从环境变量中读取CFLAGS/CXXFLAGS/LDFLAGS,make工具也不会。
虽然make可以从环境变量中读取CFLAGS,但是他最终传给gcc还是需要在Makefile的命令行上指定,否则即使make有效,但也不会传给gcc。
$ cat Makefile
all: a.out
a.out: main.c
gcc $(CFLAGS) $< -o $@
clean:
rm a.out
$ CFLAGS="-O2 -DDEBUG" make
gcc -O2 -DDEBUG main.c -o a.out
网友评论