2

我是新手,所以我提前感谢您的帮助和耐心。我用 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,但我想将我的代码展开,以便我可以轻松地看到项目的构成。

如果这是多余的,我深表歉意。我在这里浏览了几个小时的论坛。我找不到我的确切问题。再次感谢你的帮助

4

2 回答 2

2

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

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

于 2013-07-28T02:42:03.257 回答
0
  1. 只有需要的功能被链接。拆分程序的文件数量无关紧要。

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

  3. 不。

于 2013-07-28T02:47:30.707 回答