c – MSVC10 / MP在项目中的文件夹之间不构建多核

我希望有人指出我们遇到的问题或解决方法.

使用/ 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中发生这种变化.

上一篇:c – MSBuild错误:命令退出,代码为255


下一篇:c – 使用VS2010的msbuild进行构建时,是否可以从命令行设置平台工具集?