C语言 CMake 是将包含的标头中的所有内容编译到可执行文件中,还是仅编译主类中使用的部分



我正在编写一个C程序,其中可执行文件大小的每一点都很重要。

例如,如果我的程序只需要来自 stdlib.h 的 printf(),那么包含标头是否真的会导致该库中的所有内容都被复制到 CMake 编译的可执行文件中?

> CMake 只是构建系统生成器。最终可执行文件的内容由链接器以及与其一起使用的选项决定。典型的链接器只会将他们可以确定必要的内容链接到可执行文件中 - 除非您要求它们链接所有内容。但是,它们可以减少足迹的程度有一些限制。

经验法则是,如果你使用在foo.o中找到的函数,那么整个foo.o都会被链接;因此,如果大小优化是你的目标,那么给每个函数提供自己的编译单元是个好主意。

您使用的标头

没有任何影响,因为标头是在编译时处理的,而不是在链接时处理的。

最后但并非最不重要的一点是:在标准库的大多数实现中,printf 系列函数是最重量级的函数之一,所以如果你正在计数,请不要使用它们。

原则上,标头应该是幂等的,也就是说,如果不使用声明,它们不应影响可执行文件。 stdlib.h应该只有原型、预处理器宏定义和结构定义之类的东西,它不应该包含可执行代码或变量声明。

链接器根据需要包含标准库代码。 但是,C 运行时库库 (RTL) 可能在 DLL 或共享对象中具有此代码,具体取决于您的平台。 使用 DLL(或等效项)不会影响可执行文件的大小,但当然会影响使用的内存。 由于 DLL 代码在进程之间共享,因此 C RTL 保留在内存中的情况并不少见,但是,假设动态链接,无论运行的 C 进程数量如何,都只有一个副本。 大多数 C RTL 将为每个进程分配一些内存, 但多少取决于编译器/平台.

最新更新