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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 08:21:46