如何给Make命令来传递参数

本文介绍如何通过Makefile和make命令设置宏定义以控制代码中的调试开关,并演示了如何根据不同需求动态调整宏定义。

译系统的时候,我们一般只要简单的输入make执行就可以了。但有时候,我们还是需要让make命令带入一些参数给makefile脚本。

比如,你在代码里面需要定义一个宏DEBUG来打开调试开关,代码如下:

 

int main()
      {
          int i=9;
      #ifdef DEBUG
          i=1;
      #else
          i=0;
      #endif
          PRintf("i=%d/n", i);
          return 0;
      }
 


一般来说,这个宏定义可以通过直接修改源代码进行,但这样显然不是很好的办法。另外一个办法是通过makefile修改,比如:

 

CFLAGS=-g -Wall -DDEBUG

object=myprog

all:$object

myprog:a.c

gcc ${CFLAGS} a.c -o ${object}
 


如果更进一步,连makefile都不想修改,我们可以通过向make命令传递参数来进行,为此,我们需要适当的修改makefile如下:

 

CFLAGS=CFLAG

CFLAGS+=-g -Wall -DDEBUG

object=myprog

all:$object

myprog:a.c

gcc ${CFLAGS} a.c -o ${object}
 


此时,如果想打开DEBUG宏,我们可以这样输入make命令:

 

[ychq@ICM3-2 net]$ make CFLAG=-DDEBUG

gcc -g -Wall -DDEBUG a.c

a.c: In function `main':

a.c:9: warning: implicit declaration of function `printf' [ychq@ICM3-2 net]$
 


我们可以发现,DEBUG宏已经被正确的传入。


更进一步的,我们可以通过传递不同的参数给make,让make编译不同的模块。


转载地址:http://www.yn11.net/html/2012/05-23/1443.html

### 向 Makefile 传递参数的方法 在构建项目的过程中,有时需要动态调整编译选项或路径。为了实现这一点,可以通过命令行向 `Makefile` 传递参数。 #### 使用命令参数传递变量 当运行 `make` 命令时可以直接通过命令行定义变量并将其传递给 `Makefile`[^2]。例如: ```bash make var=value target_name ``` 这里 `var` 是 `Makefile` 中的变量名称,在文件内可以使用 `${var}` 或者 `$(var)` 的形式来引用该变量。这种方式允许用户在不修改原始配置的情况下灵活改变行为。 #### 修改环境中的变量 另一种方法是在调用之前设置 shell 环境变量,这些也会被自动识别为 `Makefile` 变量[^3]。比如: ```bash export CPPFLAGS="-O2" make all ``` 此操作会使得所有的子进程中都存在名为 `CPPFLAGS` 的环境变量,并且其值会被用于整个构建过程之中。 #### 多级 Makefile 参数继承 对于多目录结构下的复杂工程来说,通常会有多个不同层次上的 `Makefile` 文件参与工作。此时顶层 `Makefile` 能够将某些特定标志或者宏定义转发给下一层级使用的 `Makefile` 实现统一管理[^1]。这一般借助于 `-f`, `include` 关键字以及显式的变量赋值完成。 下面是一个简单的例子展示如何在一个更复杂的场景中应用上述概念: 假设有一个项目的根目录包含两个源码文件夹 src 和 test ,其中各自拥有独立但是关联紧密的小型模块化程序;那么可以在顶级创建如下所示的内容片段来进行跨层级间的数据共享: ```makefile # Top-level Makefile snippet SUBDIRS := src test MY_CFLAGS ?= -g -Wall .PHONY: $(SUBDIRS) all: $(SUBDIRS) define compile_in_subdir = @echo "Compiling in $1..." $(MAKE) -C $$PWD/$1 CFLAGS="$(MY_CFLAGS)" endef $(foreach dir,$(SUBDIRS),$(eval $(call compile_in_subdir,$(dir)))) ``` 在这个案例里,如果希望更改优化级别,则只需简单地追加新的命令参数即可覆盖默认设定: ```bash make MY_CFLAGS="-O3" all ``` 这样不仅简化了维护成本还提高了系统的可移植性和易用性。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值