gcc是一个编译工具,我们平时写的c/c++代码要想变成可执行文件,必须要经过预处理、编译、汇编、连接等步骤。gcc工具就完成这些动作。

一gcc编译过程

二、gcc常用参数

1.编译过程常用参数

参数 解释
-c 只编译不连接,生成目标文件.o
-S 只编译不汇编,编译后停止
-E 只预处理
-g 包含调试信息的编译
-o file 指定输出文件。无论是预处理、编译、汇编、链接都可以使用.
-I[dir] 指定搜索头文件路径

举例:

将hello.c只做预处理为hello.i

将预处理后的hello.i文件编译成hello.s汇编文件

将hello.s汇编文件编译成hello.o的目标文件

将hello.o文件编译成最后的可执行文件,并执行

2.库选项

linux下静态链接库和动态链接库

.a[libname.a] 静态库格式

.so[libname.so] 动态库格式

参数 解释
-ststic 静态编译
-shared 1.生成动态库
2.进行动态编译
-L dir 库文件搜索中添加路径
-fPIC 生成使用相对位置无关的目标代码,然后通常用于使用gcc的=static选项从该PIC目标文件生成动态库文件

3.警告选项

参数 解释
-w 关闭所有警告
-Wall 发出gcc提供的所有有用的警告
-pedantic 发出ansi c的所有警告

4.优化选项

参数 解释
-o/-o1 编译器会试图减少目标码的大小和执行时间
-o2(常用) 多优化一些。除了设计空间和速度的交换的优化选项,执行几乎所有的选项
-o3 优化的更多
-o0 不优化

三、gdb调试工具

1.进入调试模式

下面是事先写好的为了调试用的代码

带调试信息的编译,进入调试模式。进入调试模式后命令行的开头变成(gdb)

2.断点

先使用list命令,查看源代码。看将断点打在哪里

①打断点

b(break) 函数名
b(break) 行号
b(break) 文件名:行号
b(break) 行号if条件

②查看断点

ib(info break)

③删除断点

d(delete) 短点号

3.运行

r (run) 运行到断点处会停下来
c (continue) 运行到断点处会停下来
q (quit) 退出gdb调试

4.单步调试

n(next) 运行到函数处直接跳过,而不进入函数体内
s(step) 进到函数体内
f(finsh) 跳出当前函数体

5.打印值/监控

 p (printf)  打印出当前变量的值wi   会弹出一个类似windows下的图像框,更方便的观察调试步骤

使用wi命令

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ON7aX6KZ-1625276433959)(\images\linux\21.png)]

四、make命令的介绍

在linux中常常使用make命令来编译程序,特别是大程序。而make命令所执行的动作依赖Makefile

1.Makefile作用

i.工程文件组织,编译成复杂的程序

ii.安装及卸载我们的程序。

2.Makefile编写规则

Makefile由若干条规则构成

形式:

targets(目标):prerequisites(依赖) …

command(命令)

例如:

hello:main.c fun1.c fun.cgcc main.c fun1.c fun2.c -o hello
//这就是一个Makefile文件包含的一系列规则
//第二行是table键的缩进,不能以空格键缩进

来个稍微复杂的

3.Makefile变量

①用户自定义变量

有点类似于c语言中的宏定义

定义的变量引用$(变量名)

上面是原内容。我们定义一个myobject的变量,让它等于debug.o add.o mux.o下面再使用时用$(变量名)即可

变量中有一些特殊的赋值操作:

= :普通的赋值

:= :立即赋值

?= :判断赋值

+= :追加赋值

立即赋值:立即把变量的当前值,赋值给别的变量

判断赋值:判断被赋值的对象是否为空,如果是,执行赋值操作,如果不为空,不执行赋值操作

追加赋值:拼接字符串的效果,把一个变量,添加到另一个变量的后面

②预定义变量

相当于系统自带的变量

变量 解释
AR 库文件维护程序的名称,默认值为ar
AS 汇编程序的名称。默认值为as
CC c编译器的名称,默认值为cc
CXX c++编译器的名称,默认值为g++
ARFLAGS 库文件维护程序选项,无默认值
ASFLAGS 汇编程序选项,无默认值
CFLAGS c编译器选项
CxxFLAGS c++编译器选项

③自动变量及环境变量

变量 解释
$* 不包含扩展名的目标文件名称
$< 第一个依赖文件名称
$? 所有时间戳比目标文件晚的依赖文件
$@ 目标文件完整名称
$^ 所有不重复的依赖文件

4.make工作流程

1、make会在当前目录下找名字叫“Makefile”或者“makeflie”的文件

2、如果找到,它会找文件中的第一个目标文件(target)并把这个文件最为最终的目标文件

3、根据时间戳生成目标文件

4、递归去寻找目标文件依赖文件,并且递归生成

5.Makefile管理命令

命令 解释
-C dir 读入指定目录下面的Makefile
-f file 读入当前目录下的file文件为Makefile
-i 忽略所有命令执行错误
-I dir 指定被包含的Makefile所在目录

五、静态库与动态库的制作

前面已经介绍了在linux中动态库用libxx.a,静态库用libxx.so表示。

静态库: 是在程序编译的时候会被链接到当前的程序当中

动态库: 程序在运行过程中会被加载到程序当中

1、动态库的制作

①首先准备三个文件,这里以add.c、add.h、main.c为例

这里只做简单的动态库的封装的演示,代码比较简单。


封装的对象为:add.c 即功能实现的过程

②将add.c转换成xxx.o文件

gcc -c add.c -o add.o

转换后xx.o已经是二进制文件

③制作静态库ar cr指令

ar cr libadd.a add.o
//libxx.o库文件已生成

静态库制作完成,下面是将静态库添加到工程中

④编译

gcc -static main.c -L./ -l add -o add
//第一个add为库文件的名字,第二个add为生成目标对象的名字

上述命令解释:

-static:声明这是一个静态库

-L:后面跟libxx.o库文件的路径(该命令的路径为当前目录)

-l(小写L):后面跟库文件名

执行add的结果正确,使用的是静态库。

2、动态库的制作

①制作库的源码(这里还是以上述三个文件为例)

main.c、add.c、add.h

②将add.c转换成add.o

gcc -c add.c -o add.o

③制作动态库

gcc -shared -fpic add.o -o libadd.so
//动态库libadd.so生成

④编译

gcc main.c -L./ -l add -o main
//-L:后面跟库路径
//-l:后面跟动态库的名字

⑤运行

这里需要把我们制作的动态库文件libxx.so放到系统/usr/lib目录下。才能运行我们的代码。否则会报错找不到动态库文件。

参考学习视频

更多详细参考资料

提取码:g4hp

gcc/gdb/make/动/静态链接库介绍相关推荐

  1. Linux gcc 制作动/静态链接库

    gcc 静态链接库 以 math.c为例 gcc -c math.c ar rcs libmath.a math.o ar命令 将多个文件打包成一个备份文件 参数r:用来替换库中已有的目标文件,或加入 ...

  2. c语言之动静态链接库

    静态链接库.a 出于版权保护行为,将源文件编译但不链接生成.o文件,再用ar工具将多个.o文件归档成.a文件,该.a文件就被称为静态链接库.再发布.a和.h文件,h文件显示有.o中函数声明.用户即可知 ...

  3. GCC 编译 C(C++)静态链接库(gcc -L、gcc -l)和动态链接库(gcc -fPIC -shared)的创建和使用

    1. 库文件 所谓库文件,读者可以将其等价为压缩包文件,该文件内部通常包含不止一个目标文件(也就是二进制文件). 值得一提的是,库文件中每个目标文件存储的代码,并非完整的程序,而是一个个实用的功能模块 ...

  4. 【四、静态库与动态库(共享库)】揭开链接库的神秘面纱:手把手教你制作静态链接库与动态链接库

    前言 不管是在 Windows 下开发,还是在 Linux 下开发,我们都会经常性的使用一些库文件,这些库文件的特点就是,我们可以看到接口的原型并通过这些接口来调用这个函数的功能,但是我们无法查看这个 ...

  5. GCC编译过程与动态链接库和静态链接库

    1. 库的介绍 库是写好的现有的,成熟的,可以复用的代码.现实中每个程序都要依赖很多基础的底层库,不可能每个人的代码都从零开始,因此库的存在意义非同寻常. 本质上来说库是一种可执行代码的二进制形式,可 ...

  6. 【转】gcc 编译使用动态链接库和静态链接库

    1 库的分类 根据链接时期的不同,库又有静态库和动态库之分. 静态库是在链接阶段被链接的(好像是废话,但事实就是这样),所以生成的可执行文件就不受库的影响了,即使库被删除了,程序依然可以成功运行. 有 ...

  7. GCC 编译使用动态链接库和静态链接库

    1 库的分类 根据链接时期的不同,库又有静态库和动态库之分.静态库是在链接阶段被链接的(好像是废话,但事实就是这样),所以生成的可执行文件就不受库的影响了,即使库被删除了,程序依然可以成功运行.有别于 ...

  8. Python3源码编译和使用静态链接库lib动态链接库dll详细介绍

    说明: 本文主要介绍: 1.python3源码的下载和编译内核工程(pythoncore) 2.编译的lib和dll使用例子. 若需要编译源码PCBuild下其他python工程,类似参考内核工程(p ...

  9. 动态链接库(.dll) 动态导入库(.lib) 静态链接库(.lib)

    这次分享的宗旨是--让大家学会创建与使用静态库.动态库,知道静态库与动态库的区别,知道使用的时候如何选择.这里不深入介绍静态库.动态库的底层格式,内存布局等,有兴趣的同学,推荐一本书<程序员的自 ...

最新文章

  1. Windows同时安装python3.0和python2.7
  2. 一张图探秘施耐德电气全生命周期服务的无限可能
  3. python访问数据库日志文件_python利用inotify实现把nginx日志实时写入数据库
  4. a*算法流程图_学好流程控制结构轻松应对高考数学程序算法题
  5. bat批量删.svn
  6. vue计算属性computed与监听属性watch的基本使用
  7. 多媒体视频知识入门贴zt(一)
  8. ubuntu16.04下FSA-Net环境安装和训练
  9. -m commit git_Git 天天用,但是 Git 原理你了解吗?不进来了解一下?
  10. PCL之点云配准--ICP
  11. eclipse启动时return code 13
  12. csv文件的读写-列表,字典方式
  13. python常用数学符号_数学菜鸟的AI学习攻略-AI学习常用数学符号 - 老牛博客
  14. C语言初学之自学总结
  15. word文档怎么在方框内打勾
  16. iframe异步加载技术及性能转
  17. 畅通工程1863(并查集)(WA的思考)
  18. 【FI】财务预制凭证界面隐藏过账按钮
  19. 微信公众号、小程序账号被冻结的解决方法
  20. 数据可视化路上——中国地图可视化

热门文章

  1. 三菱服务器显示003C,三菱电机空调出现故障代码大全及原因
  2. vim自动补全插件:YouCompleteMe使用前需要做的准备工作随手记录
  3. FQ队列throttled流管理
  4. js替换关键词为链接,只替换一次,要避开超链接或图片
  5. 苏州企业拿到商标注册证后,需要注意哪些事项?
  6. 【SpringBoot DB系列】Jooq批量写入采坑记录
  7. CAD2010软件安装资料及教程
  8. Linux系统之部署iWebShop电子商城网站
  9. 互联网校招技术面试解析
  10. UVA 1626括号序列DP