我编写了一个脚本,该脚本生成一个包含版本,svn标记,内部版本号等常量的头文件。然后,我有一个类,用这个信息创建一个字符串。
我的问题如下:由于在每次编译中都创建了文件,编译器会检测到标题已更改,并强制重新编译大量文件。我猜问题是在头文件的情况下。我的项目是一个库,标题必须位于“世界接口”头文件中(必须公开)。
我需要一些建议来最小化编译时间或减少强制重新编译的文件。
答案 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中,并添加一些公共方法来从其他源文件中访问它们。