版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
序号 | 名称 | 功能描述 |
---|---|---|
1 | cpp | C预处理器 |
2 | gcc | C编译器 |
3 | g++ | C++编译器 |
4 | gccbug | 创建BUG报告的Shell脚本 |
5 | gcov | 覆盖测试 工具,用于分析在程序的哪个位置做优化效果最佳 |
6 | libgcc | GCC 的运行库 |
7 | libstdc++ | 标准C++库 |
8 | libsupc++ | 提供支持C++ 语言的函数库 |
C/C++
程序常用文件名后缀:
序号 | 扩展名 | 文件内容 |
---|---|---|
1 | .a | 静态库 ,由目标文件 构成的文件库 |
2 | .c | C 源码,必须经过预处理 |
3 | .C .cc .cpp | C++ 源码,必须经过预处理 |
4 | .h | C/C++ 源码的头文件 |
5 | .i | .c 经过预处理 得到的C 源码 |
6 | .ii | .C .cc .cpp 经过预处理 得到的C++ 源码 |
7 | .s | 汇编语言 文件,是.i 文件编译 后得到的中间文件 |
8 | .o | 目标 文件,是编译 过程得到的中间文件 |
9 | .so | 共享对象库 ,也称动态库 |
gcc
编译过程:
从hello.c
到hello
(或a.out
)文件,必须历经hello.i
、hello.s
、hello.o
,最后才得到 hello
(或a.out
)文件,分别对应着预处理
、编译
、汇编
和链接
4个步骤,整个过程如图所示:
序号 | 步骤 | 工作内容 |
---|---|---|
1 | 预处理 (Preprocessing ) | C 编译器 对各种预处理命令 进行处理,包括(1) 头文件包含 、(2) 宏定义的扩展 、(3) 条件编译的选择 等 |
2 | 编译 (Compilation ) | 将预处理 后的文件进行词法分析 、语法分析 、语义分析 及优化 后,生成相应的.s 汇编文件 |
3 | 汇编 (Assemble ) | 将编译 后的汇编代码 翻译成机器码 ,生成.o 目标文件 |
4 | 链接 (Linking ) | 通过链接器ld 将目标文件 和库文件 链接在一起,生成可执行文件 |
链接
可分为动态链接
和静态链接
:
序号 | 链接 | 描述 |
---|---|---|
1 | 动态 链接 | 使用动态库 进行链接,生成的程序在执行的时候 需要加载 所需的动态库 才能运行。动态链接 生成的程序小巧,但是必须依赖动态库 ,否则无法执行 。 |
2 | 静态 链接 | 使用静态库 进行链接,生成的程序包含程序运行 所需要的全部库 ,可以直接运行 ,不过体积较大 。 |
gcc开发工具
编译器gcc (编译选项、静态库和动态库的制作与使用)
gcc特点:能够实现交叉编译(在当前cpu平台能够编译出在其他cpu平台运行的代码)
静态库和动态库的制作和使用:
1、库文件:只能使用保存其函数与变量,但看不到源码
2、Linux库文件分类:
静态库.a:使用静态库编译程序,是在编译时加载
动态库.so:使用动态库编译程序,是在运行时加载
区别:
{
一个在运行是编译,一个在运行前就编译好
静态库大占内存多
动态库易于升级
静态库运行快
}
3、Linux库文件存放位置:/lib系统所需库 /usr/lib第三方软件需要的库
4、制作静态库 :
1、gcc add.c
gcc sub.c 编译成.o
2、ar rcs libcal.a add.o sub.o(前缀是lib,后缀是.a)
3、gcc main.c-lcal -L/root/0923/lib(-l 确定使用静态库 -L为存放位置 -没有位置则为相对路径)