确定C中库函数使用的空间

确定C中库函数使用的空间,c,header,C,Header,我有一大堆代码需要分析,我不知道怎么做。我有一堆代码,在这里和那里使用的是来自我的IDE附带的名为math.h的头文件中的数学函数。我被要求看看有多少空间被用来包括这个。具体来说,是编译器包含所有库函数,还是仅包含我们使用的函数。没有正在创建的对象文件。因此,我认为库代码正在编译到各个文件中。有什么好办法解决这个问题吗?我不能只注释掉include,因为这样代码就不复杂了,我也不知道大小,如果我注释掉所有使用数学函数的行,它就没有真正的代表性 您可以使用objdump命令查看对象文件中的各个符号

我有一大堆代码需要分析,我不知道怎么做。我有一堆代码,在这里和那里使用的是来自我的IDE附带的名为math.h的头文件中的数学函数。我被要求看看有多少空间被用来包括这个。具体来说,是编译器包含所有库函数,还是仅包含我们使用的函数。没有正在创建的对象文件。因此,我认为库代码正在编译到各个文件中。有什么好办法解决这个问题吗?我不能只注释掉include,因为这样代码就不复杂了,我也不知道大小,如果我注释掉所有使用数学函数的行,它就没有真正的代表性

您可以使用
objdump
命令查看对象文件中的各个符号及其所需的空间

请注意,除非您正在进行静态编译,否则库方法通常不会复制到生成的二进制文件中,而只是被引用(并在加载程序时通过动态链接器引入)


由于
math.h
是标准C库的一部分,因此基本上保证该库的副本始终在内存中,因此动态链接的额外内存和空间需求是最小的。(在静态链接过程中,程序不直接需要的所有符号都会被丢弃,数学函数也不会太大,因此使用量也应该相当小).

如果头文件中包含函数的定义,并且如果它们只是声明,则仅被引用,则头文件中的代码将被编译到正在使用的.c的目标文件中。然后,链接器将为每个符号找到一个定义,并将其放在可执行文件中(如果您使用动态链接),操作系统将在运行时拉入该定义

我在哪里使用该命令?这是我添加到构建流中的内容吗?我相信我使用的是静态构建,但我会检查一下。@user1054210 objdump是GNU binutils的一部分,它将在任何安装了开发工具链的合理(即非Windows)机器上通过命令行安装并可用。LOL我使用的是win 7开发工具。我正在为win 8机器开发嵌入式系统…Doh。我在7中编程,在8中调试…但我将尝试查看是否从我的7机器上的命令行运行-谢谢,我需要证明其他数学函数没有被编译到我的文件中。所以我在想,我可以添加,让50行代码使用相同的数学函数和变量,然后编译,然后对50个不同的数学函数执行相同的操作,我应该看到即使重复使用相同的变量,代码的大小也会增加。然后这证明(如果我使用的是其他地方没有使用过的新函数),只有使用过的函数才会被添加……或者有更好的方法吗?没有更好的方法可以做到这一点。特别是一旦你考虑优化,你可以在电话里排队。据我所知,您不进行的任何调用都不会添加到对象中。您可以这样说,因为您可以为函数添加声明而不调用它,并且不会得到链接器错误。@user1054210任何正常的静态链接器都只包括您使用的函数及其使用的函数。静态链接期间,未使用的内容不会复制到二进制文件中。(如果你在他们所在的地方找到一个链接器,那么构建你的工具链的人需要被枪毙)。我同意只做老板想做的事。我们需要把所有的东西,电源,尺寸。。。我们甚至可以删除浮点数据,并将其全部转换为整数。我们现在正在做一系列需要优化的trig。@user1054210在走向极端之前,我会先看看编译器和链接器中的大小优化。查看或查找gcc