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

将目标文件存至独立目录时,为何无需用-MT选项生成依赖?

GNU Makefile 依赖生成自动添加目标路径的原因解析

你遇到的核心疑问在于:为什么没有手动用-MT指定带路径的目标文件,GCC生成的.d文件里却自动包含了build/obj/main.o这样带存储路径的目标?

关键原因:GCC会根据-o参数自动推导依赖目标

当你在编译命令中使用-o指定输出的目标文件路径时,GCC预处理器会自动将这个完整路径作为依赖文件(.d)中的目标名称,无需额外通过-MT手动指定。

在你的Makefile编译规则里:

${OBJ}: ${OBJ_DIR}/%.o: ${SRC_DIR}/%.cc | ${BUILD_DIRS}
    ${CXX} ${CXXFLAGS} ${CPPFLAGS} ${INCLUDE} -c $< -o $@

这里的-o $@明确指定了输出目标是build/obj/main.o(对应$@的值),GCC会直接把这个路径作为.d文件的目标,所以生成的main.d里会自动出现build/obj/main.o作为依赖目标。

为什么添加-MT $@没有变化?

当你尝试在CPPFLAGS里加上-MT $@时,本质是手动指定了和GCC自动推导结果完全一致的目标路径,所以最终生成的.d文件内容没有任何区别。只有当你需要自定义依赖目标名称(比如和实际输出目标不同)时,-MT才会起到作用。

你的例子验证

看你生成的main.d内容:

build/obj/main.o: src/main.cc include/howdy.hh
include/howdy.hh:

这里的目标build/obj/main.o正是来自编译命令中-o $@指定的路径,完全符合GCC的自动推导逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 06:25:19