C内核库包含和膨胀

时间:2013-07-28 02:30:53

标签: c coding-style linker include include-guards

我是新人,所以我提前感谢您的帮助和耐心。我用C编写了一个程序:

main.c
arpsend.h - header w/include guard for arpsend.c functions
arpsend.c - includes <net/if.h>, <pthread.h>, etc.
arprec.h  - header w/include guard for arprec.c functions
arprec.c  - includes <net/if.h>, <pthread.h>, etc.

arpsend和arprec文件使用许多相同的内核库函数和定义。我注意到当我编写arprec.c代码时,我的程序大小出现了。它比我的代码应该拥有的更多。这使我得出结论,arpsend.c和arprec.c都链接了各自.c文件中自己需要的linux库代码。链接对于项目来说是多余的,但对于每个.c文件都是必需的。

我的问题如下:

  1. 如果我添加到项目中的每个.c文件都会因为内核和标准库冗余而膨胀,那么每个程序都不会变得不必要地膨胀吗?我的例子中的膨胀可能是微不足道的(约12k),但我只能想象如果我需要在几个不同的.c文件中使用一些图形库,那将会发生什么样的膨胀。

  2. 有没有办法避免这种情况?

  3. 建议的解决方案是在一个文件中使用相同的内核代码简单地保留所有功能吗?

  4. 如果#3是正确的,那不就是试图保持干净的代码吗?它是C,所以它不是真正的OOP,但我想把我的代码传播出来,以便我可以很容易地看到项目的构成。

  5. 如果这是多余的,我道歉。我在这里通过论坛筛选了几个小时。我找不到我的确切问题。再次感谢您的帮助

2 个答案:

答案 0 :(得分:2)

当您将arprec.c文件添加到项目中时,您认为您的二进制文件应该增加了多少,而不是它增加了多少?

无论项目中有多少文件使用库函数,库函数都只链接到最终的可执行文件中。链接器通常是智能的,只包含最终可执行文件中代码实际使用的库函数;是否有可能arprec.c使用arpsend.c没有的库调用?

答案 1 :(得分:0)

  1. 仅链接了所需的功能。您将分割程序的文件数量无关紧要。

  2. 如果使用共享库,则链接将在运行时完成。

  3. 没有