我是嵌入式系统的新手,想了解更多信息,
我目前正在针对ARM嵌入式系统的占用空间优化软件,并且想知道您在源文件中包含的头文件。它们放在哪里?
现在我只是使用软件(OVP)来模拟ARM硬件平台,但在实际硬件中,您必须将头文件放在某处?就像在gcc上有高清标准库一样。我们还必须在嵌入式计算机中插入此库吗?空间有限!有没有办法减少图书馆的大小?谢谢!
示例
#include <stdio.h>
#include <stdlib.h>
我正在使用交叉编译器arm-elf-gcc
最好的问候
答案 0 :(得分:11)
您似乎对编译的可执行代码存在一些基本的误解。以下内容适用于嵌入式和桌面系统。
头文件只不过是其他任何源文件。不同之处在于它们由预处理器插入编译单元而不是直接编译。此外,在大多数情况下,它们仅包含声明性语句,并且通常不会在可执行指令或存储数据的意义上对生成的代码做出贡献。
在运行时您的源代码必须存在于目标上;编译器的工作是从源生成本机可执行机器代码。正是这个机器代码存储并在目标上运行。
头文件与库不同。它(仅仅)(通常)是库内容的声明(函数原型和其他符号声明,例如常量,数据,宏,枚举)。该库采用存储在组合存档中的预编译/汇编目标代码的形式。链接器的工作是将所需的库代码与从您自己的源代码编译生成的目标代码组合在一起。这是在目标上存储和执行的链接可执行文件,而不是原始源代码。
仅包含声明性代码的头文件的例外情况是它们在宏中包含内联代码或可执行代码。但是,如果应用程序明确调用此类代码,则仅占用应用程序中的空间。
链接库代码时,只链接应用程序代码中引用所需的库对象代码组件,而不是整个库(除非整个库仅由单个目标文件组成)。
答案 1 :(得分:1)
该库确实必须包含在刻录到嵌入式系统内存中的映像中。通常,您告诉链接器去除未使用的函数,这对于节省内存非常有用。但是这个内存是程序在闪存中占用的内存或者用于非易失性代码存储的任何内存。它没有说明程序在运行时需要多少RAM。您还可以告诉编译器优化空间,并使用不同的运行时库 - 供应商提供的库通常不会像它们那样快或小。