Makefile中使用 for 控制结构编译多个目标文件

本文介绍了一种利用Makefile中的for循环来批量构建多个目标文件的方法。通过定义变量和使用通配符,可以实现从源文件到目标文件的自动化构建过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

假如,有很多文件,每个文件都要变成一个单独的目标文件,如果使用makefile的话,最好能用一个 for 循环来做。

makefile是支持使用 for的。

先假定有下面几个文件:

a.h  b.h  test1.cpp  test2.cpp

$ cat a.h 
#ifndef A_H
#define A_H
class A
{
public:
void Do(void){}
};
#endif

 $ cat b.h 
#ifndef B_H
#define B_H
class B
{
public:
	void Do(){}
};
#endif

$ cat test1.cpp 

#include "a.h"

int main(void)
{
	A a;
	a.Do();
	return 0;
}


$ cat test2.cpp 
#include "b.h"

int main(void)
{
	B b;
	b.Do();
	return 0;
}

Makefile可写成如下的形式:

CXX = g++
CXXFLAGS = -g -I. -Wall
SRCS = test1.cpp test2.cpp
OBJECTS = $(SRCS:%.cpp=%.o)
TARGETS = $(SRCS:%.cpp=%)
all : $(TARGETS)
	@for target in $(TARGETS); \
	do                        \
	$(CXX) $(CXXFLAGS) -o $$target $$target.cpp; \
	done
clean:
	-rm -f $(TARGETS) $(OBJECTS)
$ make
g++ -g -I. -Wall    test1.cpp   -o test1
g++ -g -I. -Wall    test2.cpp   -o test2

其中

TARGETS = $(SRCS:%.cpp=%)

相当于

TARGETS = $(patsubst %.cpp,%,$(SRCS))

需要说明的几点:

1. 因为 for属于 shell 命令,所以这里的target变量需要再加上一个$ , 确保shell接收到的是 $target (makefile会先把 $$target 处理为 $target, 传给shell).

2. 因为,makefile的 target对应的 命令,每一行都是在一个单独的subshell里执行,所以,如果想要 shell 变量始终是可见的话,需要加一个反斜线,表示这些命令是在一个 subshell里执行。




评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值