【问题标题】:Do I have to recompile C++ code everytime during development?在开发过程中每次都必须重新编译 C++ 代码吗?
【发布时间】:2018-03-03 08:57:35
【问题描述】:

假设我们有一个庞大的代码库,并且我们正在使用 C++ 进行开发。我们是否必须每次都重新编译才能测试代码?

如果是,那么开发需要很长时间。

这个问题的解决方法是什么?

【问题讨论】:

  • 答案是肯定的。 ccache 之类的工具有帮助。还要确保使用具有适当依赖跟踪的构建系统,以便它只重建需要重建的部分。
  • 通常构建和重建之间存在差异。其中 build 只会重新编译受影响的 obj 文件。我知道 gcc 和 clang 是如何处理这个问题的。
  • 只需重新编译已更改的文件。将您的项目划分为库。请注意,所有编程语言都会发生完全相同的问题。它被解释或编译的事实并没有改变这一事实。
  • 通常你在模块中组织你的代码,例如库,那么你不需要重建所有,只需要你改变的模块。
  • "解决这个问题的方法是什么?"它被称为构建系统,例如Make,或CMake,或Scons

标签: c++ gcc g++ clang llvm-clang


【解决方案1】:

是的,如果你想测试它,你肯定需要编译 C++ 代码。 C++代码不经过编译就无法执行。

但是,如果您巧妙地组织项目,编译可能只需要几秒钟,甚至可能长达一分钟,即使有数千个(甚至更多)文件。

默认情况下,您的构建系统将运行incremental build,除非您之前明确请求“重建”或“清理”。然后它将相应地调用编译器/链接器并确保它只编译/链接需要的内容(如果 cpp 文件没有更改,则无需编译它,这一切都基于文件时间戳,如果“对象”文件(生成)比cpp文件(源)旧,构建系统知道它是最新的并且不会再次生成它。如果您使用Visual Studio和/或CMake或任何IDE,构建系统,它们都支持那个!

此外,您可以遵循一些准则来加快速度:

首先,在模块(库)中组织您的项目,最好使用动态链接。那么当一个库中的一个文件被改变时,只需要编译这个库(其他库或使用修改后的库的程序将不必再次编译)。

当你只修改一个实现文件(cpp文件)时,只需要这个文件+使用它的模块的链接。

当您修改头文件(h 文件)时,包括它在内的所有 cpp 文件都需要重新编译,因此您必须小心优化您的包含。尽可能选择 forward declaration (see why here) 包含(否则,您的头文件成为所有 cpp 文件的依赖项,使用包括您在内的其他头文件...作为级联,修改此头文件最终需要编译cpp 文件的音调)。不要包含您不需要的文件(因为当头文件更改时它会触发一个新的无用构建)。可能使用precompiled headers 来加速编译。

注意:正如所评论的,显然有一些工具可以interpret C++ without compiling it...但这不是 C++ 最初设计的目的。而且我怀疑它们在运行时会像编译代码一样快......所以你可能会节省 20 秒的增量构建时间,然后在运行时松散几分钟......

【讨论】:

  • > "C++ 代码未经编译就无法执行。"好吧,严格来说,可以解释 c++ 程序,并且有一些工具可以做到这一点:stackoverflow.com/questions/69539/…。并不是说它们在 C++ 开发中广受欢迎。
  • @GrigoryRechistov:谢谢,不知道,我会更新我的帖子。
猜你喜欢
  • 2012-08-14
  • 2019-06-02
  • 2017-01-06
  • 2011-06-20
  • 1970-01-01
  • 2011-05-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多