MSVS2012 C++中如何使用NMake编译子目录下的Makefile?
我来帮你把GNU Make的那套子项目编译逻辑转换成NMake兼容的写法,适配MSVS2012的环境。NMake和GNU Make语法有不少重叠,但子目录执行的细节需要调整,下面是具体实现方案:
在MSVS2012中用NMake按依赖顺序编译子目录项目
核心思路
和GNU Make的逻辑一致,我们需要先定义好按依赖顺序排列的子项目列表,为每个子项目创建伪目标,然后在目标规则里切换到对应子目录执行NMake,完成后返回上级目录即可。
完整的顶层NMakefile示例
# 自定义变量,方便调试输出(和原GNU Make逻辑对齐) _TARGET = $@ _DEPEND = $< # 按依赖顺序排列的子项目列表 SUB_PROJECTS = folder2 folder1 folder3 # 声明伪目标,避免和同名文件/目录冲突 .PHONY: all $(SUB_PROJECTS) # 默认目标:编译所有子项目 all: $(SUB_PROJECTS) @echo Making all completed! # 子项目编译规则:逐个进入子目录执行NMake $(SUB_PROJECTS): @echo "*******************************" @echo "* MAKING: $(_TARGET)" @echo "*******************************" cd $(_TARGET) && nmake $(MAKEFLAGS) @echo "* FINISHED: $(_TARGET)"
关键细节说明
- 环境准备:必须打开MSVS2012专属的命令提示符(比如「Visual Studio 2012 Command Prompt」),这样NMake才能正确调用VS的编译工具链,否则会出现找不到编译器的错误。
- 子目录执行逻辑:
cd $(_TARGET) && nmake $(MAKEFLAGS)这条命令会切换到目标子目录,执行NMake并传递顶层的Make参数,完成后自动返回上级目录(因为用&&连接命令,cd的作用范围仅局限于当前命令序列)。 - 伪目标声明:
.PHONY在NMake中同样有效,用来标记这些子项目目标不是实际的文件,确保每次执行都会触发编译逻辑,不会因为目录存在而跳过。 - 参数传递:
$(MAKEFLAGS)可以把顶层NMake的参数(比如/n只打印命令不执行、/f指定非默认Makefile)传递给子目录的NMake,保持编译行为的一致性。
额外注意事项
如果子目录的Makefile不是默认的Makefile(比如命名为SubProject.mk),可以修改子项目规则里的NMake命令为:cd $(_TARGET) && nmake /f SubProject.mk $(MAKEFLAGS)
内容的提问来源于stack exchange,提问作者code_fodder
相关产品推荐
相关产品推荐

