万能makefile写法详解

万能makefile写法详解

去发现同类优质开源项目:https://gitcode.com/

本文档详细介绍了如何编写一个实用的makefile,它能自动编译当前目录下所有.c源文件,并在任何.c、.h或依赖的源文件被修改后,自动重编那些改动了的源文件,未改动的不编译。

特点

  • 支持自动编译当前目录下所有.c源文件。
  • 当.c、.h或依赖的源文件被修改后,只重新编译相关的源文件。
  • 详细介绍了makefile中的关键技术和用法。

使用说明

  1. 使用wildcard函数获取当前目录下所有.c文件的列表。
  2. 利用make的多目标规则、模式规则等技术,自动生成每个.c文件对应的依赖描述文件.d。
  3. 通过include命令包含所有.d文件,实现依赖性自动更新。
  4. 支持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),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值