1st.初识GCC——关于GCC编译器的相关语法与介绍
一个C文件要变成可执行的文件,需要经过四个过程
- 预处理(处理以“#”为开头的命令)
- 编译(将.c .i等文件翻译成汇编代码)
- 汇编(将汇编代码翻译成机器代码)
- 连接(将生成的多个目标文件(.o文件)连接起来,生成可执行文件)
主要用到的工具叫做arm-linux-gcc,arm-linux-ld,本次学习的是gcc工具。
几条常用命令选项:
-E: 预处理后即停止
-S: 编译后不汇编
-c: 预处理+编译+汇编,但不连接
-o file: 指定输出文件为file。无论哪个环节,这个选项都可以使用
编译单个文件的语句,只需要一句话即可
1 gcc -o hello hello.c
这条指令,即直接将C文件生成成可执行文件"hello"
虽然这里是一条指令,但已经包含了几个步骤了。
1 gcc -E -o hello.i hello.c //对C文件做预处理 2 gcc -S -o hello.s hello.i //进行编译,生成汇编文件 3 gcc -c -o hello.o hello.s //对汇编代码编译成目标文件 4 gcc -o hello hello.o //生成可执行程序hello
对于多个文件,需要进行逐个编译,再做最后的连接。
1 gcc -c -o mian.o mian.c 2 gcc -c -o sub.o sub.c 3 gcc -o test mian.o sub.o
也可以直接连接编译生成
1 gcc -o test mian.c sub.c
其中发现的几个小问题并且已解决:
关于arm-linux-gcc与gcc的区别
在编译过程中分别试了一下两条代码
代码<a>
1 arm-linux-gcc -o hello hello.c
代码<b>
1 gcc -o hello hello.c
两者自然都能生成可执行文件[hello],但在Ubuntu上运行时,却是代码<b>可以运行,而<a>不可执行。
后有网上答案说:arm-linux-gcc编译出来的是在arm上使用的,gcc是在PC上使用的。自然不同。