gcc学习

掌握 GCC  GDB 的常规 使用 编译过程

编译步骤: 1 2 3 4

c文件 “先预处理” C中的.h文件与其他的头文件 生成.i文件

把预处理文件 “编译”成汇编文件 .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的这个文件 调用静态库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: 简单分析源码

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值