【问题标题】:Move intermediate files of Visual Studio C++ build to another machine将 Visual Studio C++ 构建的中间文件移动到另一台机器
【发布时间】:2019-02-19 15:09:47
【问题描述】:

我们正在寻找一种方法来加快本地 C++ 构建。我们有一个简单的想法。我们定期在构建服务器上构建我们的解决方案。这种构建是增量的:当我们推送新的更改时,只重建解决方案的必要部分。快速、方便。

如果我们将 VS 生成的所有中间文件从构建服务器复制到本地机器会怎样?理想情况下,VS 应该在这些中间文件之上生成增量构建。快速、方便。

问题是,我们的构建服务器和本地机器使用不同的解决方案路径。这不适用于增量构建。

我对测试项目的尝试: 1.将所有中间文件从构建服务器复制到本地机器 2.将所有中间文件的时间戳更新为当前时间 3. 将所有 *.tlog 文件中的所有路径从特定于服务器更改为特定于本地

第一印象很好:VS 报告项目是最新的,没有要构建的,是的!但是,如果我更改单个文件,VS 会尝试重新使用它已经拥有的预编译头文件来重建它。而且我有很多这样的错误:

1>e:\dev\prod3\shared\sdk\src\common\tblockalloc.h(18): error C2995: 'BlockManagerSPtr GetBlockManager(void)': function template has already been defined (compiling source file Requests.cpp)
1>d:\agent-home\xml-data\build-dir\ama-actd-job1\shared\sdk\src\common\tblockalloc.h(15): note: see declaration of 'GetBlockManager' (compiling source file Requests.cpp)

在不同路径的标题中出现相同的符号似乎很困惑。

好的,我尝试像替换 .tlog 文件一样简单地替换 PCH 文件中的路径。但是即使我不更改任何文件,VS 也会立即认为该项目已过时。这令人惊讶,因为我认为它不会查看文件本身,而只会观察它们的时间戳。无论如何,它会吐出大量这样的错误:

1>e:\dev\prod3\shared\app.restserver\src\constants.cpp(1): warning C4652: compiler option 'StdCall(/Gz)' inconsistent with precompiled header; current command-line option will override that defined in the precompiled header
1>e:\dev\prod3\shared\app.restserver\src\constants.cpp(1): warning C4652: compiler option 'CDecl(/Gd)' inconsistent with precompiled header; current command-line option will override that defined in the precompiled header
1>e:\dev\prod3\shared\app.restserver\src\constants.cpp(1): warning C4652: compiler option 'general PM representation(/vm[smv])' inconsistent with precompiled header; current command-line option will override that defined in the precompiled header
1>e:\dev\prod3\shared\app.restserver\src\constants.cpp(1): warning C4652: compiler option 'support for new floating-point model (/FP)' inconsistent with precompiled header; current command-line option will override that defined in the precompiled header
1>e:\dev\prod3\shared\app.restserver\src\constants.cpp(1): warning C4652: compiler option 'vtordisp(/vd[012])' inconsistent with precompiled header; current command-line option will override that defined in the precompiled header
1>e:\dev\prod3\shared\app.restserver\src\constants.cpp(1): warning C4652: compiler option 'DLL library (/MD)' inconsistent with precompiled header; current command-line option will override that defined in the precompiled header
1>e:\dev\prod3\shared\app.restserver\src\constants.cpp(1): warning C4652: compiler option 'Debug static MT library (/MTd)' inconsistent with precompiled header; current command-line option will override that defined in the precompiled header
1>e:\dev\prod3\shared\app.restserver\src\constants.cpp(1): warning C4653: compiler option 'Optimizations (one or more of /Oawstgp[y]) or debug checks (one or more of /GZ, /RTCcsu)' inconsistent with precompiled header; current command-line option ignored
1>e:\dev\prod3\shared\app.restserver\src\constants.cpp(1): warning C4653: compiler option 'For loop scope conformance (/Zc:forScope)' inconsistent with precompiled header; current command-line option ignored
1>e:\dev\prod3\shared\app.restserver\src\constants.cpp(1): error C2855: command-line option '/Zc:threadSafeInit' inconsistent with precompiled header

好像不喜欢我和 PCH 混在一起。

所以在这一点上我有点卡住了。我希望找到一些关于如何重用 Visual Studio 的构建工件来实现简单的增量构建的信息,但我实际上发现 什么都没有

有可能吗?有人试过吗?

【问题讨论】:

标签: c++ visual-studio precompiled-headers build-server incremental-build


【解决方案1】:

我们有类似的东西。我们只有 VS 解决方案的相对路径,然后我们还使用适当的时间戳存储(空/伪造).tlog 文件。我们只存储库,而不是中间目标文件,所以当有人为库更改文件时,我认为我们会重建完整的库。但是我们对预编译的头文件没有任何问题,它们是最新的,我们有相同的标志,所以我认为你的构建服务器和本地构建之间的设置不同。我们没有这个问题,因为 VS 标志来自我们的 Makefile,所以一切都是一致的。

最大的缺点是当我们迁移到 CMake 时,我们将面临一场艰苦的战斗来重现层次结构,就像我们为自定义构建所做的那样。

那么也许您应该使用像 Incredibuild 这样的现成产品。

【讨论】:

  • 很高兴听到有人遇到同样的问题!您能否澄清一下:如果您“重建完整的图书馆”以防万一发生任何变化,那么拥有 PCH 的意义何在?或者你的意思是你重建整个图书馆,除了 PCH?
  • PCH 用于加速单个编译单元。它不适用于整个库,您也可以从一个文件中受益(只要 pch 中的依赖项是稳定的)。但后来我讨厌 PCH,因为它让人们变得懒惰,并且默认情况下包含所有内容,让他们考虑效率;)
  • “只要 pch 中的依赖项是稳定的”——有趣的一点!如果依赖项发生变化,VS 是否能够正确触发 PCH 的重建? (在我们的案例中经常发生,可悲的是)
  • 如果您的依赖关系不稳定(头文件不断变化),可能预编译的头文件不是正确的方法,因为这些对整个项目来说是常见的。但是,如果您正确设置了时间戳,那么是的,VS 应该正确触发重建。但这是一个灰色区域,因为它不是公共 API,并且可能会与 VS2019 或新的 msbuild 冲突:/
  • “但这是一个灰色地带”——我同意……但它仍然很诱人。非常感谢您的cmets!如果你不介意的话,也许我稍后再回复你:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-10-19
  • 1970-01-01
  • 2021-10-15
  • 1970-01-01
  • 1970-01-01
  • 2015-09-15
  • 1970-01-01
相关资源
最近更新 更多