美文网首页selector
CFLAGS/CXXFLAGS/LDFLAGS和gcc的关系

CFLAGS/CXXFLAGS/LDFLAGS和gcc的关系

作者: CodingCode | 来源:发表于2018-07-06 16:12 被阅读316次

CFLAGS/CXXFLAGS/LDFLAGS和gcc的关系

多年的实践经验里面我们经常使用这些变量来和编译器配合使用,来控制编译器的行为。

今天想当然的以为他们是自动配合的,即:

  1. 在环境变量里面设置CFLAGS的值
    $ export CFLAGS=...
  2. 运行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

相关文章

网友评论

    本文标题:CFLAGS/CXXFLAGS/LDFLAGS和gcc的关系

    本文链接:https://www.haomeiwen.com/subject/vykbuftx.html