编译并链接许多.c源程序使用的.h头文件



我在一个小组工作,我们的测试桶有数百个.c源程序。.c程序相当小,它们都包含相同的10.h头文件。这些.h文件相当大。

每次我们得到一个新的库文件来链接我们的测试程序进行测试时,我们都会运行一个脚本来重新编译和运行我们的测试桶。问题是编译需要相当长的时间,尤其是在环境是虚拟的情况下。

有没有一种方法可以编译一次.h头文件,放在一个单独的对象文件中,并让这些.c源文件链接到所述对象文件?我认为这将加快编译时间。我愿意更改/删除.c源程序中的所有#include。

非常感谢任何关于加快编译时间的建议

另外,我应该说脚本执行makefilePER.c源测试程序!makefile不会被告知编译当前目录中的所有程序。每个测试程序都被编译成自己的可执行文件。

您可以使用预编译头功能。看见http://gcc.gnu.org/onlinedocs/gcc/Precompiled-Headers.html

您已经提出了进一步的建议来加快编译速度。

一种方法可以是使用ccache。基本上,ccache保留到目前为止编译的对象文件的缓存,并在识别到同一源文件正在被再次编译时返回它们(而不是一遍又一遍地重新编译)。

使用它应该像一样简单

  1. 安装ccache
  2. 在gcc/cc/g++命令前面加上ccache

重写标题。去掉所有定义并保留在标题中。去掉所有的实现并放入新的.c.编译为库。与解决方案链接。在运行时系统上分发库。

如果我理解正确的话,库的工作方式通常是在对象文件中使用预编译的代码(Linux系统上的.so?),同时提供用于项目的头文件(.h)。

当编译时,#include <library.h>指令会找到该头并将其内容粘贴到正在编译的源文件中。然后,一旦编译了源文件,它就会链接到预编译的对象文件。这样,库就可以包含在大量的项目中,而不需要每次都从源代码编译。链接到库时,唯一必须重新编译的部分是头中(相对)少量的代码,这基本上使源代码可以访问库函数和变量。

所有这些都意味着,为了大幅加快编译速度,最好的办法是从10.h文件中删除所有函数,而只在头中保留函数原型。一旦所有函数都位于单独的.c源文件中,就可以将它们编译为对象文件(通常为-c标志)。然后,每当您需要根据通常使用的10个标头编译新程序时,您可以包含标头的精简版本,并链接到预编译对象。由于只需要编译.c文件中的新代码,而不需要编译头文件中的所有代码,因此过程应该更快。

最新更新