如何写makefile

本文介绍了C++中makefile的基本用法,包括目标、依赖和命令的三要素,以及make的工作原理。文章详细讲解了如何编写makefile来管理编译过程,如设置自动化变量如OBJ、CXXFLAGS,使用.PHONY、wildcard、patsubst等特性,并给出了实例来展示如何编译源代码文件。此外,还涉及了清理目标的编写。

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

本文参考文章【C++】make的基础用法 所做的学习笔记

一、makefile三要素

  • 目标,可以是Object File,也可以是可执行文件,还可以是一个标签

  • 依赖,生成 目标 需要的文件或者是另一个目标。可以是多个,也可以没有

  • 命令,make需要执行的命令。可以有多条,一条占一行

基本格式:

[目标]:[依赖]
[命令](命令前面一定是tab键,不能是空格)

二、make工作原理

生成目标 需要—检查—>依赖条件,若有依赖条件则通过命令生成目标;

若没有依赖条件,则需寻找新规则来生成依赖条件(依赖条件为子目标,循环上述步骤,直至生成总目标)。

三、常见的自动化变量解析

.PHONY,makefile的特殊变量。以clean为例,第一种情况,我们不需要生成"clean"这个文件,另一种情况“clean”目标与文件"clean"重名时,目标不会执行。所以我们需要一个"伪目标"去执行makefile中的“clean”下面的命令。
wildcard,用于防止通配符解析失败。使变量定义时,括号里的通配符仍然生效。
patsubst,用于防止替换文件解析失效。替换文件后缀。

四、实战解析

CXX = g++        
TARGET = hello 
OBJ = main.o printhello.o factorial.o        #以上三行为添加变量,用变量代表对应文件

$(TARGET): $(OBJ)        #目标:target,依赖:obj。即生成target需要依赖用到obj所包含的文件
    $(CXX) -o $(TARGET) $(OBJ)        #命令:编译target文件和obj文件

main.o: main.cpp        #目标:main.o文件,依赖:main.cpp文件。即生成main.o需要依赖于main.cpp
    $(CXX) -c main.cpp    #命令:编译main.cpp,可得到main.o

printhello.o: printhello.cpp     #目标:printhello.o文件,依赖:printhello.cpp文件。(与上同)
    $(CXX) -c printhello.cpp    #命令:printhello.cpp,可得到printhello.o

factorial.o: factorial.cpp    #目标:factorial.o文件,依赖:factorial.cpp文件。(与上同)
    $(CXX) -c factorial.cpp    #命令:factorial.cpp,可得到factorial.o
CXX = g++
TARGET = hello 
OBJ = main.o printhello.o factorial.o    #以上三行为添加变量,用变量代表对应文件

CXXFLAGS = -c -Wall    #添加变量,-Wall是打印g++所提示的警告信息

$(TARGET): $(OBJ)    #目标:target,依赖:obj。即生成target需要依赖用到obj所包含的文件
    $(CXX) -o $@ $^    #命令:编译目标文件target和依赖文件obj。$@表示目标文件,$^表示所有的依赖文件
                                                     
%.o: %.cpp    #将.o和.cpp的同名文件相匹配
    $(CXX) $(CXXFLAGS) $< -o $@    #将第一个依赖文件(产生带调试信息的可执行文件)生成目标文件

.PHONY: clean    #清除命令
clean:
    rm -f *.o $(TARGET)    #删除所有.O和目标文件
CXX = g++    #添加变量CXX为编译指令g++
TARGET = hello     
SRC = $(wildcard *.cpp)    #添加变量SRC为所有的.cpp文件
OBJ = $(patsubst %.cpp, %.o, $(SRC))
#添加变量OBJ。搜寻SRC中文件后,若类型为.cpp或.o则统一替换成patsubst
#以上三行为添加变量,用变量代表对应文件

CXXFLAGS = -c -Wall    #添加变量,-Wall是打印g++所提示的警告信息

$(TARGET): $(OBJ)    #目标:target,依赖:obj。即生成target需要依赖用到obj所包含的文件
    $(CXX) -o $@ $^    #命令:编译目标文件target和依赖文件obj。$@表示目标文件,$^表示所有的依赖文件
                                                     
%.o: %.cpp    #将.o和.cpp的同名文件相匹配
    $(CXX) $(CXXFLAGS) $< -o $@    #将第一个依赖文件(产生带调试信息的可执行文件)生成目标文件

.PHONY: clean    #清除命令
clean:
    rm -f *.o $(TARGET)    #删除所有.O和目标文件

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值