You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在单步构建目标时预编译头文件?

为你的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目标,把预编译头文件也加入删除列表,避免旧的预编译头干扰新构建。

额外提示:

  1. 预编译头里只放不经常修改的内容(比如标准库头、第三方库头、你的基础通用头),才能最大化编译提速效果。
  2. 如果有多套编译配置(比如Debug/Release),要为不同配置生成独立的预编译头,或者确保编译选项完全匹配对应配置。
  3. GCC和Clang都支持.gch格式的预编译头,这套规则对两者都适用。

内容的提问来源于stack exchange,提问作者Josh Olson

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:03:48