条件编译:通过make传递参数来控制 | 您所在的位置:网站首页 › makefile命令行参数 › 条件编译:通过make传递参数来控制 |
我们在编译时有时想要分不同情况进行编译,条件编译可以解决这个需求,下面就来举一个实例。 一、实例 (Ⅰ)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 实验室设备网 版权所有 |