嵌入式 Linux下最常用的C语言编译器GCC命令详解
ieee I EEE 前天
GCC(GNU Compiler Collection)是 Linux下最 常用 的C语言编译器 ,是 GNU项 目中
符合A NSI C标准的编译系统,能够编译用C、C ++和Obj ect C等语言编写的程序 。同
时 它 可 以 通 过 不 同 的 前 端 模 块 来 支 持 各 种 语 言 ,如 Java 、 Fortran 、 Pascal 、
Modula-3和Ada等。
穿插一个玩笑 :GNU意思是GNU’s no t Unix而非角马。然而GNU还是一个未拆分
的连词 ,这其实是一个源于 hacker的幽默 :GNU是一个 回文游戏 ,第一个字母G是凑
数的 ,你当然可以叫他做A NU或者 BNU。下面开始。
一.CC编译程序过程分 四个阶段
◆ 预处理 (Pre-Processing)
◆ 编译(Compiling)
◆ 汇编(Assembling)
◆ 链接(Linking)
Linux程序员可以根据 自己的需要让GCC在编译 的任何 阶段结束转去检查或使用编译
器在该阶段的输 出信息 ,或者对最后生成的二进制文件进行控制 ,以便通过加入不 同
数量和种类的调试代码来为今后的调试做好准备 。如 同其他的编译器 ,GCC也提供了
灵活而强大的代码优化功能 ,利用它可以生成执行效率更高的代码。
GCC提供了30多条警告信息和三个警告级别 ,使用它们有助于增强程序的稳定性和可
移植性 。此外 ,GCC还对标准的C和C ++语言进行了大量的扩展 ,提高程序的执行效
率 ,有助于编译器进行代码优化 ,能够减轻编程的工作量。
二.简单编译命令
我们以Hello world程序来开始我们的学习。代码如下 :
/* hello.c */
#include
int main(void)
{
printf ("Hello world!\ n");
return 0;
}
1. 执行如下命令 :$ gcc -o hello hello.c
运行如下 :$ ./ hello
输 出 :Hello,world!
2. 我们也可以分步编译如下 :
(1) $ gcc – E hello.c -o hello.i
//预处理结束
//这时候你看一下hello.i ,可以看到插进去了很多东西。
(2) $ gcc –S hello.i
//生成汇编代码后结束
(3) $ gcc –c hello.c
或者 :
$ gcc -c hello.c –o hello.o
或者 :
$ gcc -c hello.i -o hello.o
//编译结束
//生成 hello.o文件
(4) $ gcc hello.o –o hello.o
或者 :
$ gcc –o hello hello.c
//链接完毕 ,生成可执行代码
3. 我们可以把几个文件一 同编译生成 同一个可执行文件。
比如 :一个工程有 main.c foo.c def.c生成foo的可执行文件。
编译命令如下 :
$ gcc –c main.c foo.c def.c –o foo
或者 :
$ gcc –o foo main.c foo.c def.c
三.库依赖
函数库是一些头文件 (.h)和库文件 (.so或者.a)的集合。Linux下的大多数 函数都默认将
头文件放到/ usr/ include/ 目录下 ,而库文件则放到/ usr/ lib/ 目录下 ,但并非绝对如
此。因此GCC设有添加头文件和库文件的编译选项开关。
1. 添加头文件 :-I
例如在/ home/work/ include/ 目录下有编译foo.c所需头文件 def.h ,为了让 GCC能
找到它们 ,就需要使用-I选项 :
$ gcc foo.c -I / home/work/ include/def.h -o foo
2. 添加库文件 :-L
例如在/ home/work/ lib/ 目录下有链接所需库文件 libdef.so ,为了让 GCC能找到 它
们 ,就需要使用-L选项 :
$ gcc foo.c – L / home/work/ lib – ldef.a –o foo
说 明 :-l选项指示GCC去连接库文件 libdef.so。Linux下的库文件命名有一个约定 ,
即库文件以lib三个字母开头 ,因