如何为包含预编译sub.o文件的C++项目编写Makefile?
预编译目标文件场景的Makefile编写指南
依赖关系确认
- 最终可执行文件(示例中命名为
main)依赖两类文件:编译main.cpp生成的main.o、预编译好的sub.o main.o的依赖项为main.cpp和sub.h:main.cpp是源码文件,sub.h包含sub函数的声明,二者任意一个修改都需要重新编译main.osub.o是预编译产物,无需编写生成规则,直接作为链接阶段的依赖项使用即可
完整Makefile示例
# 声明伪目标,避免和目录下同名文件冲突 .PHONY: all clean # 默认目标,生成最终可执行文件 all: main # 链接生成可执行文件main # $@ 指代当前目标,此处为main # $^ 指代所有依赖项,此处为main.o、sub.o main: main.o sub.o g++ -o $@ $^ # 编译生成main.o # $< 指代第一个依赖项,此处为main.cpp main.o: main.cpp sub.h g++ -c -o $@ $< # 清理规则,删除生成的可执行文件和中间目标文件 clean: rm -f main main.o
核心逻辑说明
- 不需要为
sub.o写编译规则:因为没有对应源码权限,make会自动识别sub.o是已存在的有效目标文件,直接参与链接,不会尝试重新生成 - 必须把
sub.h加入main.o的依赖:如果后续sub.h的函数声明发生修改,main.o会自动重新编译,避免出现调用参数不匹配的运行时错误 - 自动变量可以简化编写:
$@、$^、$<是make内置的自动变量,不用手动硬编码文件名,后续修改文件名或新增依赖项时调整成本更低
使用方法
- 将Makefile、
main.cpp、sub.h、sub.o放在同一目录下 - 执行
make命令即可生成可执行文件main - 执行
make clean可清理所有生成的产物
内容的提问来源于stack exchange,提问作者zzzz
相关产品推荐
相关产品推荐

