【问题标题】:Referencing the same project in two solutions causes building of the second solution to fail在两个解决方案中引用同一个项目会导致构建第二个解决方案失败
【发布时间】:2019-05-18 17:28:13
【问题描述】:

在 TFS 构建服务器上构建复杂项目时出现错误。我能够通过更简单的设置重现错误,我将在此处使用它来描述问题。由于年代久远和复杂,该项目仍然使用 Visual Studio 2010 的构建工具。

我有一个包含两个解决方案的存储库:WindowsProject1 和 WindowsProject2,它们都是 MFC 应用程序。 我还将项目 WindowsProjectTools 添加到两个解决方案中,因为两个解决方案中的主项目都引用了该 dll。

在构建服务器上构建解决方案时会出现这样的问题:

第一个构建步骤 (WindowsProject1) 成功,但第二个构建步骤 (WindowsProject2) 失败并出现以下错误:

Error C1090: PDB API call failed, error code '23' : '(

网络上有一些关于这个错误的问题,但从来没有一个令人满意的解决方案。

我怀疑在两个构建步骤中构建 WindowsProjectTools 会由于某种原因发生冲突,可能中间文件夹相交,所以我将其更改为 $(SolutionDir)$(Configuration)\ 但没有帮助。

但是,更改构建步骤顺序有助于构建 WindowsProject2 成功,但 WindowsProject1 失败。这让我相信解决方案和项目文件是有序的,但是我缺少 TFS 中的一些设置。

我也尝试将 MSBuild 版本从最新更改为 4.0(与 VS2010 关联的版本),但没有成功。

迁移到较新的 vs 版本是显而易见的一步。但是,迁移整个项目需要大量资源。我现在想避免这一步。

【问题讨论】:

    标签: visual-studio-2010 tfs msbuild mfc


    【解决方案1】:

    我在 Jenkins 构建服务器中发现了一个几乎类似问题的错误报告:https://issues.jenkins-ci.org/browse/JENKINS-9104

    程序 mspdbsrv.exe 似乎不适合并行构建。 jenkins 的解决方法是更改​​临时目录:

    _MSPDBSRV_ENDPOINT_=<UUID>
    TMP=<Unique Tempdir>
    TEMP=$TMP TMPDIR=$TMP
    

    在另一个解决方案中,mspdbsrv 在整个构建过程中保持活动状态:

    rem :: PITA to keep MSPDBSRV alive
    set ORIG_BUILD_ID=%BUILD_ID%
    set BUILD_ID=DoNotKillMe
    start mspdbsrv -start -spawn
    set BUILD_ID=%ORIG_BUILD_ID%
    set ORIG_BUILD_ID=
    

    (PITA一开始把我难住了,没听说过,这会是什么新技术!?然后我笑得很开心。)

    两者都不适合我们。在后者中,构建服务器刚刚启动了另一个 mspdbsrv.exe 实例。我们猜测每次构建新解决方案时都会启动服务器。由于构建步骤之间几乎没有时间(1/10 秒),我们推测服务器程序在退出后还没有准备好重新启动。我们现在实施的解决方法是在解决方案构建步骤之间建立一个 powershell 脚本构建步骤,等待 10 秒直到继续:

    Start-Sleep -Seconds 10
    

    这为 mspdbsrv.exe 提供了充足的关机和重启时间。不再出现 pdb api 错误。

    我知道这只是另一种解决方法,但我们不能在这上面花费更多时间。我们主要关心的是,我们的构建工件是完整的并且形式正确,而其他解决方案(例如 /Z7 而不是 /Zi)则不是这种情况。因此,我们的解决方法更胜一筹。

    引发 PDB API 调用失败的其他情况,错误代码“23”可能无法通过此解决方法解决,但我的建议是考虑 mspdbsrv.exe 的行为。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-01-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多