【问题标题】:unit test - recompile only around "int main()" to reduce compilation time单元测试 - 仅围绕“int main()”重新编译以减少编译时间
【发布时间】:2017-03-23 07:51:09
【问题描述】:

我的 Visual Studio 解决方案中的一个项目可以分为:-

Library.h, Library.cpp
User.h, User.cpp  (#include Library.h)
Main.h, Main.cpp  (#include User.h)  has "int main()"

(真正的项目远比这个大。)

每当我编辑任何Library.h 文件并按F5 时,它都会重新编译整个项目。这说得通。

现在我想编写/调试Library 并单独测试它,我不想重新编译所有内容,因为它会花费更多时间。

因此:-

  • 我创建了Main2.cpp #include 只有Library.h,并且根本没有涉及User 的代码。
  • 我注释掉了整个main.cpp

这是我的 ma​​in2.cpp :-

#include "Library.h"
int main(){ .... some code about library ....}

当我按 F5 时,它编译了所有 .cpp 并运行良好。这还是有道理的。

问题

如果我编辑了Library.h,然后再按F5,它会重新编译:-

  • library.cpp
  • User.cpp
  • main.cpp
  • main2.cpp

问题

如何让 Visual Studio 只重新编译必要的文件以节省编译时间?
(在这种情况下只编译library.cppmain2.cpp

我猜需要重新编译很多文件是因为User 内部可能有一些静态函数library 做一些事情

如果我确定没有呢?
即使有某事,我也想(冒险)忽略它。

【问题讨论】:

  • 如果您有一个库,请创建一个仅包含该库的实际库项目。
  • @n.m.谢谢大神n.m。有用的评论一如既往。我很高兴你没有再用一些可怕但总是正确的评论来破坏我的梦想。

标签: c++ visual-studio unit-testing


【解决方案1】:

将您的解决方案分成 3 个项目:

  • 图书馆
  • 库测试
  • 主要

当您不想重新编译'Main'时,只需右键单击它并卸载项目即可。

您可能应该考虑将 Library.h 分解成更小的部分,以便依赖项更加独立。

【讨论】:

  • 你的意思是......如果我有 10 个单独的测试要单独编译,我必须创建 21 个项目吗? (2*n+1) .....(感谢“卸载”!) .... 你的意思是推荐“静态库”吗?
  • 没有。他们不需要分解那个小;保持它们的凝聚力。
  • 编译单个 C++ 文件不应该那么慢。如果您真的担心它所花费的时间,C++ 编译器很慢,但它们通常不会那么慢。您可能还有其他问题导致编译时间过长。查看预编译的头文件;获得SSD;购买 John Lakos 的《大规模 C++ 软件设计》。
  • "你的意思是推荐“静态库”吗?" -- 取决于你的项目。也许,也许不是。
  • 无需卸载任何东西。如果您只想构建测试项目,则有一个菜单项。
【解决方案2】:

我建议不要让 Visual Studio 头疼,而是下载适用于 Windows 的 MinGW c++ 编译器,只需编译一个较小的文件单元测试实例,您需要将其作为一种不同的项目与控制台。

【讨论】:

  • 除了换工具带来的另一个头痛之外,它也(有点?)困难,因为“库”实际上包含很多外部库(很多additional include directory+dll绑定设置) .使用 Visual Studio,我可以分析/调试观察。这是我习惯的环境。
  • 在这种情况下,您可以右键单击解决方案资源管理器中的文件,然后选择“从构建中排除”选项,但对于较大的项目,这可能会很痛苦。除非您只是从构建中禁用 main.cpp 函数,否则 main2.cpp 会接管,只要您不调用不想从其他 cpp/h 文件调用的方法,就不必担心。
  • 如果您对单个 cpp 文件进行更改,它只会编译该文件,就像您对头文件进行更改一样,包含它的所有文件都将被重新编译。因此,您可以尝试将标头移动到不同的目录中,然后将其包含在不同的目录中,或者以不同的名称复制?
  • "exclude from build" Library.h 会发生变化。在这种情况下,我希望不要重新编译User.cpp,因为Library.h 不是main.cpp 中的#include(或者至少应该有一个易于设置的选项)。
  • 那么除了做我们已经讨论过的事情之外,真的没有别的办法了。除非您可以为单元测试目的创建 Visual Studio 项目。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多