C程序在linux上的编译
GCC可以用来编译C/C++、FORTRAN、JAVA、OBJC、ADA等语言的程序,可根据需要选择安装支持的语言,在嵌入式学习中,目前只去关注gcc在C语言方面的编译功能
第一:支持文件
.c C语言源代码
.C,.cc,.cxx C++源代码文件且必须要经过预处理;
.h 程序所包含的头文件
.i 已经预处理过的C源代码文件,且不应该对其执行预处理;
.ii 已经预处理过的C++源代码文件,且不应该对其执行预处理;
.m Objective-C源代码文件;
.mm Objective-C++源代码文件;
.s 汇编语言源代码文件
.S 预编译过的汇编语言源代码文件。
.o 编译后的目标文件s
第二:了解交叉编辑器 / 交叉连接器 / 交叉编译环境 (本段文字部分参考:https://www.cnblogs.com/yangguang-it/p/6916769.html)
嵌入式产品的资源往往有限,它的资源和我们平时用的桌面计算机(后面称为开发主机,host machine)一样,那就不需要交叉编译了。但是,嵌入式系统的内存通常是几十兆字节,且只有闪存而没有硬盘这种大容量存储设备。在这种资源有限的环境中,不可能将开发工具安装在嵌入式设备中(后面称为目标机,target machine),然后像平时做桌面软件开发那样在嵌入式设备上直接进行软件开发,因此,嵌入式的开发工作一般是在主机上进行的。
当目标机的处理器和主机的处理器不同时(比如目标机是ARM处理器,而主机是X86处理器),如何保证在主机上编译的程序可以在目标机上运行呢?
在使用gcc编辑器时,
I:可以指定目标机处理器和开发主机处理器型号,型号不一致,生成交叉编译器。编译器在指定开发主机上运行,编译器生成程序仅运行于目标主机。
II:可以不指定(默认目标机和开发主机型号相同编译环境相同)
gcc会对源代码完成四步操作:
第三:命令 (本部分参考:https://blog.****.net/Crazy_Tengt/article/details/71699029)
1,无选项编译链接
例:命令:gcc test.c //默认生成a.out(默认名称,名称可以指定 -o:gcc test.c -o test)可执行程序
2,-E 进行预处理,编译,生成汇编文件
例:gcc -E test.c //会生成test.i文件
3,-S 进行预处理,编译,汇编,生成汇编文件
例:gcc -E test.c //会生成test.s文件
4,-c 直接生成二进制目标文件(预处理,编译,汇编,简称:编译不链接)
例:gcc -c test.c //会生成test.o文件
5,-o 对文件重命名(如第一条)
6,-w 不生成任何警告信息
7,-wall 生成所有警告信息
8, -g 附加调试信息