【问题标题】:How to avoid recompiling header files如何避免重新编译头文件
【发布时间】:2015-09-09 15:47:12
【问题描述】:

我的单个 C++ 文件包含来自各种库(如 MKL 和模板库)的许多头文件。由于包含许多语句,每次编译这个文件都需要很长时间。我尝试将包含语句分离到一个文件中,从中创建一个目标文件,并在主文件的编译过程中将其链接起来,但似乎编译器无法识别定义的对象和函数的定义头文件。 那么,如何节省这些头文件的编译时间呢?

【问题讨论】:

  • 您使用哪个编译器/平台?
  • 如果您的编译器支持预编译头文件,使用此功能可以帮助减少每次构建代码时重新编译头文件的需要。
  • 我在linux机器上使用intel编译器,它支持预编译吗?我也无法安装 ccache 实用程序,因为我没有 root 访问权限。
  • 每次都需要编译文件吗?依赖的头文件之一是否发生了变化?在我的店里,我们只在晚上通过自动服务器进行重建。开发人员通常只编译发生变化或其中一个依赖项发生变化的文件。
  • @tarek:你不需要root权限来安装ccache;你可以编译它并配置它在你的`$HOME中运行

标签: c++ compilation


【解决方案1】:

预编译头文件:

您正在做的事情听起来确实会从预编译头文件(pch's)中受益匪浅。 intel 编译器确实支持 pch,如您在此处看到的:

https://software.intel.com/en-us/node/522754.

在没有root权限的情况下安装工具

您仍然可以尝试使用 ccache 来查看这是否对您的情况有所帮助 - 它可以在不需要重新编译单元的情况下产生巨大的差异,这种情况经常发生。这样做的路径是在本地安装 ccache。通常,这可以通过将源下载到您具有写入权限的目录(我在我的主目录中保留一个安装文件夹),然后按照该项目的构建说明来完成。构建可执行文件后,您必须将可执行文件的路径添加到您的路径中——通过这样做

export PATH=$PATH:the-path-to-your-compiled-executables.

在 BASH 中。届时,您的用户将可以使用 ccache。

这里有更好的解释:https://unix.stackexchange.com/questions/42567/how-to-install-program-locally-without-sudo-privileges

CMAKE、cotire 等

最后一点——我还没有阅读有关英特尔编译器的 pch 支持的文档,但 pch 支持通常涉及一些手动代码操作,以指示编译器预编译哪个头文件等等。我建议使用 CMAKE 管理您的构建,并使用 cotire 插件来试验 pch。

虽然我从软件工程的角度对 CMAKE 感到不满,但它确实让管理您的构建,尤其是尝试各种方法来加速您的构建变得容易得多。在尝试了 pch 和 ccache 之后,您还可以尝试 ninja 而不是 make,看看这是否能让您有所改进。

祝你好运。

【讨论】:

  • 谢谢!预编译的头文件(-pch 选项)确实有所作为。我安装了 ccache 并没有注意到它在有或没有 pch 的情况下对编译时间有任何改进。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-10-06
  • 1970-01-01
  • 2013-05-09
  • 2012-04-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多