
linux gcc编译c文件头文件,使用GCC编译器编译C语言
凶猪下山
转载
关注
0点赞·1047人阅读
GCC编译C源代码有四个步骤:预处理—->编译—->汇编—->链接。
可以利用GCC的参数来控制执行的过程,这样就可以更深入的了解编译C程序的过程。
下面将通过对一个程序的编译来演示整个过程。
#include
int main()
{
printf("happy new year!\n")
return 0
}
1:预处理:编译器将C程序的头文件编译进来,还有宏的替换,可以用gcc的参数-E来参看。
预处理 命令:gcc -E hello.c -o hello.i
作用:将hello.c预处理输出hello.i
2:编译:这个阶段编译器主要做词法分析、语法分析、语义分析等,在检查无错误后后,把代码翻译成汇编语言。可用gcc的参数-S来参看。
编译器(ccl)将文本文件hello.i 翻译成文本文件hello.s, 它包含一个汇编语言程序。汇编语言程序中的每条语句都以一种标准的文本格式描述了一条低级机器语言指令。
编译命令:gcc -S hello.i -o hello.s
作用:将预处理输出文件hello.i汇编成hello.s文件
3:汇编:把编译阶段生成的.s 文件转换为二进制目标代码。可用gcc的参数-c来参看。汇编器(as)将hello.s翻译成机器语言指令,把这些指令打包成可重定位目标程序的格式, 并将结果保存在目标文件hello.o中。hello.o文件是一个二进制文件,它的字节编码是机器语言。
汇编 命令:gcc -c hello.s -o hello.o
作用:作用:将汇编输出文件hello.s编译输出hello.o文件
4:链接:把obj文件链接为可执行的文件:链接器(ld)负责.o文件的并入。结果就是hello文件,它是一个课执行的目标文件,可以加载到存储器后由系统调用。
链接命令:gcc hello.o -o hello
一步 *** 作的话是: (-o必须在hello之前 )
$gcc hello.c -o hello
$./hello或者:(会默认生成a.out文件)
$gcc hello.c
$./a.out
具体安装步骤如下,首先下载安装包。1、解压文件
解压 tar zxvf arm-linux-gcc-4.4.3.tar.gz -C/(
直接解压后就可以,-C/会让解压的文件自动放在根目录下指定路径,不用管)
下载arm-linux-gcc-4.4.3.tgz到任意的目录下,进入这个文件夹
sudo tar xvzf arm-linux-gcc-4.4.3.tgz –C /
2、建立目录
sudo mkdir /usr/local/arm
3、复制文件
sudo cp -r /opt/FriendlyARM/toolschain/4.4.3 /usr/local/arm
5、添加环境变量
修改/etc/profile文件(此文件属于系统级别的环境变量,设置在里面的东西对所有用户适用)
sudo gedit /etc/profile
增加路径设置,在末尾添加如下:
export PATH=$PATH:/usr/local/arm/4.4.3/bin。
至此安装步骤到此完成。
两个交叉编译器分别适用于armel
和
armhf
两个不同的架构,armel
和
armhf
这两种架构在对待浮点运算采取了不同的策略(有
fpu
的
arm
才能支持这两种浮点运算策略)。
其实这两个交叉编译器只不过是
gcc
的选项
-mfloat-abi
的默认值不同。gcc
的选项
-mfloat-abi
有三种值
soft、softfp、hard(其中后两者都要求
arm
里有
fpu
浮点运算单元,soft
与后两者是兼容的,但
softfp
和
hard
两种模式互不兼容):
soft:
不用fpu进行浮点计算,即使有fpu浮点运算单元也不用,而是使用软件模式。
softfp:
armel架构(对应的编译器为
arm-linux-gnueabi-gcc
)采用的默认值,用fpu计算,但是传参数用普通寄存器传,这样中断的时候,只需要保存普通寄存器,中断负荷小,但是参数需要转换成浮点的再计算。
hard:
armhf架构(对应的编译器
arm-linux-gnueabihf-gcc
)采用的默认值,用fpu计算,传参数也用fpu中的浮点寄存器传,省去了转换,性能最好,但是中断负荷高。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)