条件编译:通过make传递参数来控制 您所在的位置:网站首页 makefile命令行参数 条件编译:通过make传递参数来控制

条件编译:通过make传递参数来控制

#条件编译:通过make传递参数来控制| 来源: 网络整理| 查看: 265

我们在编译时有时想要分不同情况进行编译,条件编译可以解决这个需求,下面就来举一个实例。

 

一、实例

(Ⅰ)c语言源代码文件hello.c:

#include int main() { #ifdef DEBUG printf("#ifdef DEBUG is running!\n"); #else printf("#else is running!\n"); #endif return 0; }

通过宏定义开关DEBUG来控制需要编译的代码,这个DEBUG名字是可以自己取的,对应下面-DDEBUG中的DEBUG,这个DEBUG必须紧跟-D,否则会报错,不信你试试。

(Ⅱ)Makefile:

CFLAGS+=-g -Wall -DDEBUG HELLO:hello.c gcc ${CFLAGS} hello.c -o HELLO

这样我们就能通过在Makefile中删除或添加CFLAGS后面的"-DDEBUG"来控制c源文件中开关的开与关。

 

二、改进

但每次编译不同情形时还要修改Makefile,很麻烦。我们来改进Makefile,然后通过make命令来控制条件编译。

直接上修改后的Makefile:

CFLAGS=$(CFLAG) CFLAGS+=-g -Wall HELLO:hello.c gcc ${CFLAGS} hello.c -o HELLO

我们来运行一下,看看结果怎么样:

一、 首先打开开关,输入命令: make CFLAG=-DDEBUG 然后运行生成的可执行文件HELLO: ./HELLO 输出: #ifdef DEBUG is running! 二、 重新编译,这次不打开开关,直接make: make 再次运行生成的可执行文件HELLO: ./HELLO 输出: #else is running!

成功!

 

三、一些解释

那有的小朋宇可能就要问了,这CFLAGS是啥意思啊,-DDEBUG是啥意思,好吧,一一来解释一下。(哈哈,其实这都是我自己的问题)

1、-Wall -O -g是什么?

-Wall(-W) 打开警告开关,-w 关闭所有警告信息

-O代表默认优化,可选:-O0不优化,-O1低级优化,-O2中级优化,-O3高级优化,-Os代码空间优化。

-g是生成调试信息,生成的可执行文件具有和源代码关联的可调试的信息。调试信息是指你可以用调试工具调试你的可执行程序,可以以C语言源代码的形式查看变量、单步运行。如果没有调试信息,你在调试时只能看到一行一行的汇编单步执行,不知道具体运行到程序的哪个地方。

2、CFLAGS 这个变量是什么用的呀,感觉参数好杂。。

CFLAGS只是一个通用的约定而已,本身没有任何含义! 通过这个变量,把你的编译选项告诉编译器而已。

3、-DDEBUG是啥意思

-D是添加宏定义,DEBUG是宏的名称,可以自己定义。

 

参考:

1、https://blog.csdn.net/darennet/article/details/9003010

2、https://www.zybang.com/question/e129982132b0b8f371b5f8250c06e325.html



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有