如何在单步构建目标时预编译头文件?
为你的Makefile添加预编译头支持
嘿,很高兴能帮你调整Makefile来支持预编译头!预编译头能大幅加快编译速度,尤其是当你有很多重复包含的头文件时。下面是修改后的完整Makefile,我会一步步解释改动点:
TARGET ?= application CXXFLAGS += -Os -I. -MMD -MP -std=c++11 # 定义你的预编译头文件名(可以改成你实际想用的,比如stdafx.h) PRECOMPILED_HEADER := precompiled.h # 让所有源文件自动包含预编译头,确保编译器能识别并使用预编译版本 CXXFLAGS += -include $(PRECOMPILED_HEADER) SOURCES := $(shell find -L . -name '*.cpp') OBJECTS := $(SOURCES:.cpp=.o) DEPENDS := $(SOURCES:.cpp=.d) # 预编译头的输出文件(GCC/Clang会生成.gch后缀的预编译头文件) PRECOMPILED_TARGET := $(PRECOMPILED_HEADER).gch $(TARGET): $(PRECOMPILED_TARGET) $(OBJECTS) $(CXX) $(OBJECTS) -o $@ $(LDLIBS) # 预编译头的编译规则:必须使用和源文件完全一致的编译选项 $(PRECOMPILED_TARGET): $(PRECOMPILED_HEADER) $(CXX) $(CXXFLAGS) -c $< -o $@ .PHONY: clean clean : $(RM) $(TARGET) $(OBJECTS) $(DEPENDS) $(PRECOMPILED_TARGET) -include $(DEPENDS)
关键改动说明:
- 指定预编译头文件:新增
PRECOMPILED_HEADER变量,你可以把它改成项目里实际要预编译的通用头文件名(比如你的基础公共头common.h)。 - 自动引入预编译头:通过
-include $(PRECOMPILED_HEADER)参数,让所有C++源文件编译时自动包含这个头,不用每个文件手动写#include。 - 确保预编译头优先构建:把
PRECOMPILED_TARGET加到$(TARGET)的依赖列表里,保证编译源文件前先生成预编译头,避免编译顺序问题。 - 匹配编译选项:预编译头的编译规则必须和源文件用完全相同的
CXXFLAGS,否则编译器会因为选项不匹配而忽略预编译头,这是最容易踩坑的点! - 清理扩展:更新
clean目标,把预编译头文件也加入删除列表,避免旧的预编译头干扰新构建。
额外提示:
- 预编译头里只放不经常修改的内容(比如标准库头、第三方库头、你的基础通用头),才能最大化编译提速效果。
- 如果有多套编译配置(比如Debug/Release),要为不同配置生成独立的预编译头,或者确保编译选项完全匹配对应配置。
- GCC和Clang都支持
.gch格式的预编译头,这套规则对两者都适用。
内容的提问来源于stack exchange,提问作者Josh Olson
相关产品推荐
相关产品推荐

