嵌入式C语言编译器:GCC

1 GCC相关介绍

GCC与gcc有什么不同?

  • GCC(GNU Compiler Collection)
    • GNU编译器集合,包含众多语言的编译器:C、C++、Java、D、Objective-C、etc
  • gcc:特指GCC中的C语言编译器

GCC VS 嵌入式

  • 多数嵌入式操作系统都基于GCC进行源码编译
    • Linux、VxWorks、Android、etc
  • 实际开发中的应用
    • 内核开发:gcc
    • 应用开发:gcc / g++ / gdc

2 初识编译器

  • gcc将代码编译成可执行程序的过程会完成预处理(preprocessing)、编译(compilation)、汇编(assembly)、链接(linking)四个步骤
  • 编译器由预处理器(cpp工具,C Preprocessor)、编译器(cc工具,C and C++ compiler)、汇编器(as工具,assembler)、连接器(ld工具)组成

嵌入式C语言编译器:GCC_第1张图片

3 gcc关键编译选项

3.1 预处理指令

3.1.1 指令格式

gcc -E file.c -o file.i

3.1.2 预处理文件相关内容

从file.i文件中我们可以看到存在大量的以“#”开头的行。每行的格式是“# 行号 文件名 标志“,其中的”行号“与”文件名“表示从它后一行开始的内容来源于哪一个文件的哪一行;标志可以是1、2、3和4四个数字,每个数字的含义如下:

数字 含义
1 表示一个新文件的开始
2 表示从一个被包含的文件中返回
3 表示后面的内容来自于系统头文件
4 表示后面的内容应当被当作一个隐式的’extern “C”’块

当file.c使用到非系统头文件且它们不在当前目录下时,需要通过使用gcc的-I参数加以指定,否则gcc会因为无法获得必要的头文件进行宏展开而报错。

3.2 编译指令

3.2.1 指令格式

gcc -S file.i -o file.s
gcc -S -O2 file.c -o file.s

3.2.2 说明

使用-S参数时,我们可以根据需要使用-O选项。

3.3 汇编指令

3.3.1 指令格式

gcc -c file.s -o file.o

3.4 生成映射文件

3.4.1 指令格式

gcc -Wl,-Map=file.map file.c

3.4.2 说明

映射文件是通过ld链接器来生成的,我们可以通过映射文件了解一个程序文件中各符号在内存中的布局信息。gcc的-Wl选项用于指定传递给链接器的选项,-Map=file.map选项由gcc传递给链接器以指示链接器为我们生成名为file.map的映射文件。在使用-Wl选项时,它后面的选项如有多个则需要用逗号加以分割。

3.5 宏定义

3.5.1 指令格式

gcc -D'TEST="test"' file.c

3.5.2 说明

如果宏为字符串时,则需要用单引号引起来。

3.6 获取系统头文件路径

3.6.1 指令格式

gcc -v file.c

3.6.2 说明

系统头文件是指C语言本身和操作系统相关的头文件。在使用-v选项获取系统头文件路径时,必须后面带一个有效的C程序源文件,否则gcc输出的信息将不包含系统头文件路径这一内容。

3.7 生成依赖关系

3.7.1 指令格式

获取目标的完整依赖关系:
gcc -M test.c
获取目标的部分依赖关系:
gcc -MM test.c

3.7.2 说明

由于系统头文件在绝大多数情形下是不会改变的,因此在构造make所需的依赖关系时不必将它们纳入其中。通过-MM选项,可以让gcc生成不包含系统头文件的依赖关系。

3.8 指定库文件及库文件搜索路径

3.8.1 指令格式

-L选项:指定库文件的搜索路径
-l选项:指定库文件
ar crs libfunc.a func.o
gcc test.c -L. -lfunc

3.8.2 说明

注意,-L选项用于告诉gcc可以从哪个目录查找库文件,可以多次使用它以指定多个目录;-I选项则用于告诉gcc在生成可执行程序时需要链接的库名,这一选项同样可以多次使用以指定多个库。使用-l选项时要注意后面所跟的名字并不包括“lib”前缀和“.a”后缀。

修改记录


时间 动作
2017.6.9 首次上传

参考资料


唐老师 — 狄泰软件学院 — 十二月提升计划

李云 — 《专业嵌入式软件开发 全面走向高质量编程》

你可能感兴趣的:(实用工具)