单文件夹下多个cpp文件的MAKEFILE

本文分享如何使用Makefile管理C++项目,通过wildcard和patsubst函数简化编译过程,并实现clean和run任务。适合初学者理解Makefile的基础应用。

最近要写makefile,这里记录一下备忘以后方便拿来用。

当我的文件夹中有这么些个文件:
在这里插入图片描述
最开始我是手动写成这种的

CXXFLAGS := -W -Wall -O3 -std=c++17 -fconcepts

assignment3: assignment3.o linalg.o matrix.o
	$(CXX) $(CXXFLAGS) $^ -o $@
assignment3.o: assignment3.cc
	$(CXX) $(CXXFLAGS) -c $< -o $@
linalg.o: linalg.cc
	$(CXX) $(CXXFLAGS) -c $< -o $@
matrix.o: matrix.cc
	$(CXX) $(CXXFLAGS) -c $< -o $@

.PHONY: clean
clean:
	rm *.o assignment3

用起来倒是一点问题都没有,不过一个个挨着打文件名也太傻了吧,于是就去到处查资料学习最后整出个这样的来,这里用到了两个函数。

.PHONY: clean run

#我的编译选项,你可以用你自己的
CXXFLAGS = -W -Wall -O3 -std=c++17 -fconcepts
#指定删除规则
RM = -rm -rf

#注意这里我的文件后缀全是.cc,你可以改成.cpp,当然要记得把所有的都改了
srcpp = $(wildcard ./*.cc)
object = $(patsubst %.cc, %.o, $(srcpp))

#可执行文件的名称,这里你爱用什么用什么
BIN_NAME = assignment3

$(BIN_NAME): $(object)
	$(CXX) $(CXXFLAGS) -o $@ $(object)
%.o: %.cc
	$(CXX) $(CXXFLAGS) -c $< -o $@

run: 
	./$(BIN_NAME)

clean:
	$(RM) *.o $(BIN_NAME)

在这里插入图片描述
make一下看看,没啥问题
在这里插入图片描述
make run执行那个可执行文件
在这里插入图片描述
make clean清除
在这里插入图片描述
(命令行编程果然还是比IDE用起来要有操作感得多

我也是初学者,如果有什么问题与建议敬请指出。

<think>嗯,用户想要一个Linux的Makefile,把当前文件夹下所有的cpp文件编译成可执行文件,并且每行都要有注释。首先,我需要确认用户的需求:他们可能是在学习Makefile的编写,或者想要自动化编译多个C++文件。用户可能对Makefile的语法不太熟悉,所以需要详细注释。 首先,Makefile的基本结构需要了解。通常包括变量定义、目标、依赖和命令。用户需要处理所有的cpp文件,所以需要自动获取这些文件列表。我应该使用通配符来获取所有.cpp文件,比如SRCS := $(wildcard *.cpp)。然后,生成对应的目标文件,OBJS := $(SRCS:.cpp=.o),这样每个.cpp文件对应一个.o文件。 接下来,可执行文件的名字,用户可能希望和项目相关,或者默认名字,比如TARGET := app。然后需要指定编译器,CXX := g++,以及编译选项,比如CXXFLAGS := -Wall -Wextra,可能还需要优化选项如-O2。 然后,默认目标all,依赖$(TARGET),然后定义如何链接目标文件生成可执行文件。需要确保每个.o文件生成,所以需要编译每个.cpp文件到.o,这里可以使用模式规则,比如%.o: %.cpp,然后加上编译命令。 还需要清理目标clean,删除生成的文件。用户可能希望生成的可执行文件放在当前目录,所以要注意输出路径。 另外,要考虑头文件依赖,可能需要生成依赖文件,但用户的问题中没有提到,可能暂时不需要,但可以提及或者留作扩展。此外,确保使用.PHONY来声明伪目标,比如all和clean,避免和同名文件冲突。 需要检查每一行注释是否清晰,解释变量和规则的作用。用户可能是初学者,所以注释要详细,比如解释wildcard函数的作用,变量替换的方法,以及各个编译选项的意义。 可能还需要提醒用户,如果.cpp文件之间有依赖关系,比如需要特定的链接顺序或者库,可能需要额外处理,但当前需求只是编译所有.cpp文件,所以暂时不需要考虑。另外,确保示例正确,比如使用g++编译器,-o选项指定输出文件,-c选项生成目标文件。 最后,提供一个完整的示例,并逐行注释,确保用户能够复制使用,并根据需要调整。可能还需要测试这个Makefile是否在Linux环境下有效,比如使用make和make clean命令是否能正确编译和清理。</think>```makefile # 声明伪目标(不生成实际文件的目标) .PHONY: all clean # 定义编译器为g++ CXX := g++ # 编译选项:显示所有警告(-Wall)、额外警告(-Wextra)、优化等级2(-O2) CXXFLAGS := -Wall -Wextra -O2 # 获取当前目录下所有.cpp文件(通配符匹配) SRCS := $(wildcard *.cpp) # 将.cpp文件名替换为.o文件名(目标文件列表) OBJS := $(SRCS:.cpp=.o) # 最终生成的可执行文件名称 TARGET := app # 默认目标:编译最终可执行文件 all: $(TARGET) # 链接目标文件生成可执行文件 # $^ 表示所有依赖文件(即OBJS) # $@ 表示目标文件(即TARGET) $(TARGET): $(OBJS) $(CXX) $(CXXFLAGS) $^ -o $@ # 模式规则:将.cpp文件编译为.o文件 # $< 表示第一个依赖文件(即对应的.cpp文件) %.o: %.cpp $(CXX) $(CXXFLAGS) -c $< -o $@ # 清理生成的文件 clean: rm -f $(TARGET) $(OBJS) ``` --- ### 逐行关键注释解释 1. `.PHONY: all clean` - 声明`all`和`clean`为伪目标,表示它们不生成实际文件 2. `CXX := g++` - 定义变量`CXX`为C++编译器(默认g++) 3. `CXXFLAGS := -Wall -Wextra -O2` - 设置编译选项:显示所有警告
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值