如何最小化C ++中的编译时间

时间:2011-02-02 10:07:12

标签: c++

我编写了一个脚本,该脚本生成一个包含版本,svn标记,内部版本号等常量的头文件。然后,我有一个类,用这个信息创建一个字符串。

我的问题如下:由于在每次编译中都创建了文件,编译器会检测到标题已更改,并强制重新编译大量文件。我猜问题是在头文件的情况下。我的项目是一个库,标题必须位于“世界接口”头文件中(必须公开)。

我需要一些建议来最小化编译时间或减少强制重新编译的文件。

7 个答案:

答案 0 :(得分:13)

在标题中写下:

extern const char *VERSION;
extern const char *TAG;
extern const char *BUILD_DATE;

并创建一个包含

的.c(或.cpp)文件
const char *VERSION = "0.13";
const char *TAG = "v_0_13";
const char *BUILD_DATE = "2011-02-02 11:19 UTC+0100";

如果您的脚本更新.c文件,则只需重新编译该文件,但不包含标题的文件。

答案 1 :(得分:4)

在实现文件中生成常量。

确保脚本不会更改标题。

答案 2 :(得分:3)

解决此问题的最简单方法是不在头文件中创建这些常量。相反,在头文件中创建获取这些值的函数。然后将值本身放在一个实现这些函数的小cpp文件中。 (或者将它们放在仅包含在该cpp文件中的标题中)。重新编译时,只需要重新编译该文件。

此外,如果您有一些备用机器,您可以查看distcc以加快编译速度。

答案 3 :(得分:3)

如果您使用的是gcc,则可以尝试使用ccache。它根据预处理输出的散列缓存对象文件,因此除非发生实际更改,否则不会重新编译

答案 4 :(得分:2)

另一种方法是在像“my_constants.h”这样的标题中声明像extern const double PI;这样的常量值,并将一个cpp文件添加到项目中,其内容如下:

#include "my_constants.h"

const double PI = 3.1415926535;

然后实际值只会编译一次,更改值只需要编译该单个文件并再次链接项目。

答案 5 :(得分:1)

如果您想将其保留为单个公共标头,则可以添加一个预构建步骤,该步骤将获取您的公共头文件和

  • 过滤掉版本详细信息,删除它们或用固定字符串替换它们到文件的临时副本
  • 只有在更改后才将其移动到标题的内部版本,即不复制文件(+更新时间戳),除非版本以外的其他内容已更改

然后从此内部头文件构建预编译头文件。您仍然可以将public标头与需要该版本的源文件的版本详细信息一起使用。

如果您使用的是unix,可以在GCC源代码中使用moveifchanged脚本,或者您可以使用fc在Windows上的批处理文件中进行操作。

答案 6 :(得分:1)

面向对象的解决方案:

通常,您应该将那些经常刷新的cnstants放到cpp文件中,而不是h。把它们放在一个类中。如果你已经有一个创建了它们的字符串并通过方法发布它的类,我会将所有这些常量放到同一个cpp中,并添加一些公共方法来从其他源文件中访问它们。