gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 20:46:50 29 4
gpt4 key购买 nike

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

使用/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/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com