我希望有人指出我们遇到的问题或解决方法.
使用/ MP编译项目时,似乎只同时编译同一文件夹中的文件.我使用进程资源管理器来刷命令行并确认行为.
项目过滤器似乎对并发编译的内容没有任何影响.
磁盘上的项目结构:
Folder\
project.vcxproj
source\
foo.cpp
foo1.cpp
other_folder\
bar.cpp
bar1.cpp
bar3.cpp
初始进程树:
MSBuild.exe
cl.exe ( passed: source\foo.cpp source\foo1.cpp )
cl.exe ( passed: source\foo.cpp )
cl.exe ( passed: source\foo1.cpp )
在cl.exe的2个子实例完成后,父关闭并显示以下进程树:
MSBuild.exe
cl.exe ( passed: other_folder\bar.cpp other_folder\bar1.cpp other_folder\bar2.cpp )
cl.exe ( passed: other_folder\bar.cpp )
cl.exe ( passed: other_folder\bar1.cpp )
cl.exe ( passed: other_folder\bar2.cpp )
我们的源代码很好地组织在许多级别的嵌套文件夹中,这些文件夹与磁盘上的标题布局相匹配 – 我不愿意放弃它来利用/ MP.
解决方法:
在“对象文件名”(在vcxproj XML中,/ FL在CL.exe命令行上)项目中使用%(RelativeDir)会导致msbuild在每个目录的基础上将cpp文件批处理到cl.exe.这会对使用/ MP带来的好处产生重大影响.
请注意,如果您的项目对目标文件使用%(RelativeDir),则可能是配置试图避免从不同文件夹中具有相同名称的cpp文件冲突.obj文件.
/ Fo命令行参数通常是编译器将obj文件转储到的文件夹 – 只传递了一个,因此给定目录的所有cpp文件一次只能传递给CL.exe.
那是一种痛苦 – 但我很高兴有一个理由和解决方案.希望能帮助到你.
更新
团队配合发现,无论何时将MSBuild参数发送到CL.exe,它似乎都会破坏或严重限制/ MP.这很可能是因为/ MP能够很好地工作,*CL.exe需要有一堆cpp文件.
我们的解决方案是不使用’Object File Name’的任何msbuild params(我认为它的%params%).这要求我们重命名一些cpp文件,以便它们不会发生冲突.
希望在VS2012或VS2013中发生这种变化.