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

时间:2013-12-09 15:12:29

标签: c gcc hyperlink header compilation

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

每次我们获得一个新的库文件来链接我们的测试程序进行测试时,我们运行一个脚本来重新编译并运行我们的测试桶。问题是编译需要相当长的时间,特别是如果环境是虚拟的。

有没有办法编译.h头文件一次,放入一个单独的目标文件,并将那些许多.c源文件链接到所述目标文件?我认为这将加快编制时间。我愿意更改/删除.c源程序中的所有#include。

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

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

4 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

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

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

使用它应该像

一样简单
  1. 安装ccache
  2. 使用ccache
  3. 添加gcc / cc / g ++命令

答案 2 :(得分:1)

重写标题。剥去所有定义并留在标题中。剥离所有实施并投入新的.c。编译为库。与解决方案联系。在运行时系统上分发库。

答案 3 :(得分:0)

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

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

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