将目标文件存至独立目录时,为何无需用-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
相关产品推荐
相关产品推荐

