万能makefile写法详解
去发现同类优质开源项目:https://gitcode.com/
本文档详细介绍了如何编写一个实用的makefile,它能自动编译当前目录下所有.c源文件,并在任何.c、.h或依赖的源文件被修改后,自动重编那些改动了的源文件,未改动的不编译。
特点
- 支持自动编译当前目录下所有.c源文件。
- 当.c、.h或依赖的源文件被修改后,只重新编译相关的源文件。
- 详细介绍了makefile中的关键技术和用法。
使用说明
- 使用wildcard函数获取当前目录下所有.c文件的列表。
- 利用make的多目标规则、模式规则等技术,自动生成每个.c文件对应的依赖描述文件.d。
- 通过include命令包含所有.d文件,实现依赖性自动更新。
- 支持C和C++程序的混合编译。
依赖知识
- 多目标规则
- 隐含规则
- 定义模式规则
- 自动生成依赖性
安装与使用
将本makefile文件下载到您的项目目录中,根据实际情况修改编译工具CC和源文件列表sources,然后执行make命令即可编译项目。
示例makefile
以下是makefile的示例:
# 获取当前目录下所有.c和.cpp文件的列表
sources:=$(wildcard *.c) $(wildcard *.cpp)
objects:=$(patsubst %.c %.o $(patsubst %.cpp %.o $(sources)))
dependence:=$(objects:.o=.d)
# 编译工具
CC=gcc
# 最终目标
all: $(objects)
$(CC) $(objects) -o $@
# 模式规则:由.c和.cpp文件生成.o文件
%.o: %.c
$(CC) -c $< -o $@
%.o: %.cpp
$(CC) -c $< -o $@
# 生成依赖性描述文件.d
define gen_dep
set -e; rm -f $@; \
$(CC) -MM $(CPPFLAGS) $< > $@.$$$$; \
sed s/($$*)\.o[ :]*\1.o $@ :/g < $@.$$$$ > $@; \
rm -f $@.$$$$
endef
%.d: %.c
$(gen_dep)
%.d: %.cpp
$(gen_dep)
# 清除临时文件
.PHONY: clean
clean:
rm -f all $(objects) $(dependence)
学习资源
- 《跟我一起写Makefile.pdf》:适合初学者,详细介绍了makefile的基本概念和编写方法。
- 《GNU make v3.80中文手册v1.5.pdf》:更详细的make手册,适合查阅。
通过阅读本文档,您可以更好地理解makefile的编写和应用,从而提高项目编译的效率。
去发现同类优质开源项目:https://gitcode.com/
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



