为啥某些 C++ 项目构建显示 00:00:00 已用时间并且没有输出窗口详细信息?

Posted

技术标签:

【中文标题】为啥某些 C++ 项目构建显示 00:00:00 已用时间并且没有输出窗口详细信息?【英文标题】:Why do some C++ project builds show 00:00:00 elapsed time and no Output window detail?为什么某些 C++ 项目构建显示 00:00:00 已用时间并且没有输出窗口详细信息? 【发布时间】:2011-08-18 22:23:36 【问题描述】:

我们有 160 多个项目 VS2010 C++ 解决方案。我从一个完全空的输出目录和“构建解决方案”开始。我将 IDE 构建详细程度设置为正常。在构建过程中,我观察输出窗口。 (VS2010 设置为一次构建 2 个项目,每个项目一次只编译 1 个 .cpp 文件。)

大多数项目显示来自编译器(每个 .cpp 文件名)和库管理器/链接器的大量输出行。

但是 -some- 项目(最近运行 10 个)显示的输出极少。示例:

29>------ Build started: Project: DebuggingService (LHFramework\DebuggingService\DebuggingService), Configuration: Debug x64 ------
29>Build started 8/17/2011 3:23:24 PM.
29>
29>Build succeeded.
29>
29>Time Elapsed 00:00:00

显示这些症状的项目 - 未 - 禁用,它们有许多 .cpp 文件,并且相应的结果文件(.obj、.lib、.exe 等) - 由此构建生成。

当我清空构建输出目录并从头开始重新运行构建时,一组不同的项目可能会出现这些症状!

似乎那些项目构建 =are= 发生(显然花费了 00:00:00 以上),但跳过了“输出”窗口中的显示。我不知道任何影响构建输出的项目设置:我认为它仅由 IDE 级别的设置控制。无论如何,我们对所有项目都使用相同的设置,因此它们都应该显示相同级别的输出细节。

.log 文件仅包含上面输出的最后五行,减去前导的“29>”指示符。创建了各种 .tlog 文件:3 个来自“cl”,3 个来自“custombuild”,3 个来自“lib”。我几乎可以弄清楚它们的意思。 :)

可能重要的提示:我们的 .sln/.vcxproj/etc 文件是由 CMake 生成的。我没有设置,但所有项目都有一个自定义构建步骤来运行 CMake 以确定需要完成的工作(编译/链接/等)。

所以...这是 VS2010 的已知问题吗?还是我们偶然发现了一些 VS2010CMake 交互?

迈克

【问题讨论】:

当您更改以下设置时是否会发生这种情况:工具 > 选项 > 项目和解决方案 > 构建和运行 > 并行项目构建的最大数量。 (从 2 到 1)? 当我将该设置更改为“1”时,问题不会发生(基于一次尝试)。将其改回“2”,我至少在几个项目中遇到了问题。 :( 那么......该设置如何导致问题? 【参考方案1】:

我完全没有听说过这个特定的问题,但请确保您尝试将最新版本的 CMake 与 Visual Studio 2010 一起使用。最新的官方版本是从 7 月初开始的 CMake 2.8.5。 CMake 2.8.6-rc1 的第一个候选版本昨天刚刚发布。

早期版本的 CMake 在 VS 2010 解决方案中存在几个已知问题(尽管据我所知不是这个),并且许多已在 2.8.5 中得到修复。有一些非常棘手的自定义构建规则问题需要多次迭代才能完全解决。

试一试 CMake 2.8.5 或 2.8.6-rc1。也许这个问题与已经修复的问题有关......

【讨论】:

我们正在使用 CMake 2.8.4 的自定义版本,因为我们需要一个已提交但尚未在官方 CMake 中的 mod。你提到的新版本很可能;我将验证并看看我们是否可以迁移到 2.8.5。我认为我们不会获得“rc”版本。 :)【参考方案2】:

在我看来,项目依赖项导致项目被多次触发以进行构建,并且在第二次调用时,项目被跳过,因为它不需要重新构建。时间差异可以解释为什么您每次都会看到具有这种行为的不同项目。

在日志中,是否存在显示00:00:00 已用时间的项目先前实例?这将是一个很好的指标,表明它是否以前构建过。

您还可以通过转到工具 > 选项 > 项目和解决方案 > 构建和运行来提高 Visual Studio 中的 MSBuild 详细程度。将“MSBuild 项目构建日志文件详细程度”设置为“详细”或“诊断”,看看您的日志中是否有更有趣的内容。

【讨论】:

不。 :( 在“输出”窗口中没有任何项目的多个构建。所有项目仅出现一次。(并且输出目录一开始是空的,因此之前的构建没有剩余任何东西。)没有尝试增加详细程度。

以上是关于为啥某些 C++ 项目构建显示 00:00:00 已用时间并且没有输出窗口详细信息?的主要内容,如果未能解决你的问题,请参考以下文章

asp.net为啥用DateTime.Parse("2010-11-22 00:00:00") 格式化后,录入数据库变成2010-11-22 12:00:00

console.log(new Date(2022, 4, 27).toLocaleString())的结果为啥是2022/5/27 00:00:00?

为啥我从“2010-12-31 15:00:00 +000”得到“2010-01-01 00:00:00 +900”?

java时间中的1970-01-01 00:00:00转成时间戳为啥会是一个负数-28800000

为啥我从oracle数据库中读取出时间的格式是这样的:2000-01-01 00:00:00.0

LAMP实战之构建博客网站