掌握 GCC GDB 的常规 使用 编译过程
编译步骤: 1 2 3 4
1 把c文件 “先预处理” C中的.h文件与其他的头文件 生成.i文件
2 把预处理文件 “编译”成汇编文件 .s
3. 把汇编文件 “汇编” 成目标文件 .o
4. 把目标文件 “链接” 可执行文件
1.如何通过gcc编译 然后掉用?
2.Gcc常规编译项 有哪些?
3.如果使用gdb 调试 怎么使用GCC 编译?
Lesson1 : 写一个 c文件 然后 使用gcc hello.c -o hello
Lesson2: Gcc 使用参数分类
_1: 通用参数
_2: c参数
_3: C++参数
_4: object-c参数
_5: 语言无关的参数
_6: 调试参数数
_7:优化参数
_8: 编译过程参数
1.预编译参数
2.汇编参数
3.链接参数
_9: 机器依赖参数
Lesson3: 常用参数
预处理.i--编译.s--汇编.o--链接 --可执行文件 即目标文件
预处理文件--i 汇编文件--s 汇编--o
_1.编译过程的参数
-c 只编译 不链接 ,生成目标文件.o
-S 只编译 不汇编,生成汇编代码
-E 只预处理
-g 包含调试信息
-o file 指定 目标输出文件
-ldir 搜索头文件路径
格式:分步 编译:
把c文件 编译成 预处理文件
Gcc -E hello.c -o hello.i
把预处理文件 编译成 汇编文件
Gcc hello.i -S -o hello.s
把汇编文件 汇编成 目标文件
Gcc - E hello.c -o hello.o
把目标文件 链接 可执行文件
Gcc hello.o -o hello
格式: 一次性编译:
Gcc hello.c -o hello
格式:使用调试信息
Gcc -g hello.c -o hello
问题:在c代码 使用 自定义 头文件出现
例如 hello.h
Inclued<stdio.h>
C代码使用 hello.c
#include <hello.h>
使用gcc hello.c -o hellc
No such file or directort comilation tertminated 找不到文本
原因:使用 where is stdio.h 你发现在 user/includ里
系统会找当前系统文件下 或者是环境变量
解决办法:copy 到系统文件夹
Gcc 提供参数办法: gcc -I. Hello.c -o hello
.代表当前文件夹
_2.库选项(编译 动态和静态链接库.a/s)
默认是 动态链接库
A: 静态和动态链接的格式
..a: a[libname.a] 静态链接库
在编译的时候 库文件 链接成 可执行文件 发布的时候可以不用了 类库已经包含到可执行文件
不足:一所以的库文件都包含到了 可执行文件 文件过于庞大 ,二 当修改了某个库文件 还需要从新编译 不利于程序的扩展
..b: so[libname.so[]主版本号。次版本号.发行号]
在运行时候调用,并且调用相关的函数
不足:在发布的时候要有可执行文件 ,还要类库文本 版本更新的时候 同样要更新类库版本
B:库编译的 相关参数
..a: -static 静态编译
格式:
Gcc - static hello.c -o hello 是动态链接的大小10倍
原因是 需要其他的库文件都包含进来了 所以造成 执行文件包文件过于庞大
..b: 生成动态库文件 ,进行动态编译
默认情况下是动态链接库
..-L dir: 库文件搜索中添加路径
..-fPIC: 生成使用相对位置无关的目标代码 ,然后通常用于使用gcc的-static 选项从 该PIC 目标文件 生成动态库文件
..编译成静态链接库
1,先生成目标文件.o
2, ar crv[*.a][*.o] 打包工具 目标文件 打包成.a文件 静态库文件
3,调用静态链接库
格式:gcc -o[flie][flie.c] -L
操作步骤:
Gcc -c helloA.c 生成.o文件
Ar crv helloA.a helloA.o 将目标文件打包 成.a文件
调用静态链接库
Gcc -o helloB helloB.c -L./ helloA.a
./helloB
解释:动态编译helloB.c的这个C 文件 调用静态库helloA.a 生成可执行文件 helloB
..编译成动态链接库
1,生成位置无关的目标代码gcc-fPIC -c[*.c]
2., gcc -shared -o[*.so][*.o]
3, 调用动态链接库(与静态链接库类似)
Gcc -o[flie][file.c] -L
操作步骤:
Gcc -fPIC -c hello.c
Gcc- shared -o hello.so hello.o
Gcc-o hello helloB.c -L./hello.so
使用 ./hello
在编译的时候没问题是因为有关系 在运行的时候会去找 所以要配置
关于动态链接库的path
办法一Sudo cp hello.so /usr/lib/ 然后再调用
办法二 环境变量:里添加
_3.警告选项
A: 警告选项
-w 关闭所有的警报
-Wall 发出GCC 提供的所有有用的警告
-pedantic 发出ansi c的所有警告
操作:gcc -Wall hello.c -o hello
_4.优化选项
-Olevel 优化等级,一般指是在最终发布的时候才用 0--3
操作: gcc -O3 hello.c -o hello 很少用
Lesson4:编译GCC 分析源代码
_1: 思路
A:gcc依赖的几个类库及关系
m4 :多处理器类库
gmp : GUN的多精度 数字运算类库 需要依赖 m4
mpfr : 多精度浮点运算的Cl类库 需要依赖gmp
mpc : 是一个用于复杂的高精度运算的数学运算C类库
需要依赖gmp,mpfr
Gcc: 需要依赖上面的所有
B: steps
..1,下载源码 m4,gcc ,gmp,mpfr,mpc
..2,先编译-config, make
_2: 演练
A: 编译及安装gmp
B:编译及安装mpfr
C:编译及安装mpc
D:编译及安装gcc
_3: 问题及解决
_4: 简单分析源码