c++ - MSVC10/MP 在项目中跨文件夹构建非多核

标签 c++ visual-studio-2010 visual-c++ msbuild cl.exe

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

使用/MP 编译项目时,似乎只有同一文件夹中的文件会同时编译。我使用 Process Explorer 滑动命令行并确认行为。

项目过滤器似乎对并发编译的内容没有任何影响。

磁盘上的项目结构:

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 中,在 CL.exe 命令行中使用/Fo)项目中使用 %(RelativeDir) 会导致 msbuild 在每个目录的基础上将 cpp 文件批处理到 cl.exe。这会对使用/MP 获得的好处产生重大影响。

请注意,如果您的项目对目标文件使用 %(RelativeDir),则配置可能会试图避免来自不同文件夹中具有相同名称的 cpp 文件的 .obj 文件发生冲突。

/Fo 命令行参数通常是编译器将 obj 文件转储到其中的文件夹 - 只传递了一个,因此给定目录的所有 cpp 文件一次只能传递给 CL.exe。

这很痛苦 - 但我很高兴有原因和解决方案。希望对您有所帮助。


更新

一位队友发现,无论何时将 MSBuild 参数发送到 CL.exe,它似乎都会破坏或严重限制/MP。这很可能是因为要使/MP 正常工作,顶层 CL.exe 需要有一组 cpp 文件。

我们的解决方案是不对“对象文件名”使用任何 msbuild 参数(我认为是 %params% )。这需要我们重命名一些 cpp 文件,以免它们发生冲突。

希望这在 VS2012 或 VS2013 中有所改变。

关于c++ - MSVC10/MP 在项目中跨文件夹构建非多核,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7033855/

相关文章:

c++ - C++ 中以 2 为基数的科学记数法(IEEE 32 位) float 的算法或代码?

visual-studio - 如何在Visual Studio 2010中设置Qt路径?

c++ - LNK2001 即使已定义

C++:如何简化线程锁?

c++ - 解析文件时输出错误?

c++ - 类型转换双 float 的开销?

c++ - 如何从 XML-RPC 读取数组

c++ - shared_ptr 交换线程安全吗?

c# - ANTLR C# 找不到 'IAstRuleReturnScope'

Python 2.7.7 包安装给出 Visual C++ cl.exe 错误 : command failed with exit status 2