c++ - 如何避免重新编译头文件

标签 c++ compilation

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

最佳答案

预编译 header :

您正在做的事情听起来确实会从预编译头文件 (pch) 中受益匪浅。英特尔编译器确实支持 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 支持通常涉及一些手动代码操作以指示编译预编译哪个 header 等。我建议查看使用 CMAKE 管理您的构建,并使用 cotire 插件来试验 pch。

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

祝你好运。

关于c++ - 如何避免重新编译头文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32484035/

相关文章:

c++ - box2d:在 ResetMassData 上获取 SIGABRT,b2Assert(m_I > 0.0f) - 中心惯性、质心

c++ - 以下 2 个代码片段之间是否存在任何功能差异?

maven - 编译 nativetoascii maven 插件

ios - 人们在代码编译时如何有效地利用时间?

android - Maven不会因引入的编译错误而失败

c++ - 如何在 Switch 语句中使用 Cmd 行参数中提供的 TCHAR*?

c++ - 从 istream 读取

.net - 将 .NET 项目编译为独立 native 二进制文件的可用工具有哪些?

exception - 在 Perl 6 中,如何打印可能在编译时抛出的异常类型?

c++ - Lambda 捕获 C++14