Linux环境基础开发工具的使用(下)

文章目录

  • Linux编译器 - gcc/g++
    • gcc/g++如何使用
    • 预处理阶段
    • 编译阶段
    • 汇编阶段
    • 链接阶段
    • gcc选项汇总
    • 静态库与动态库
    • gdb命令汇总
  • Linux项目自动化构建工具 - make/Makefile
    • make/Makefile的意义
    • 使用make/makefile
    • 原理

Linux编译器 - gcc/g++

  • 背景知识

我们知道一个代码写完要变为可执行程序需要经过以下四个步骤

  1. 预处理(进行宏替换)
  2. 编译(生成汇编)
  3. 汇编(生成机器可识别代码)
  4. 连接(生成可执行文件或库文件)

我们知道在Linux系统不区分文件后缀,因此文本文件可以设置后缀为txt来告诉用户这是一个文本文件,但是对于Linux下的各种程序是区分后缀的,而gcc和g++它们是要看文件后缀的!

gcc/g++如何使用

  • gcc只可以编译C语言
  • g++C和C++都可以编译

语法:gcc [选项] 要编译的文件 [选项] [目标文件]
gcc code.c -o code

-o 将处理结果输出到指定文件,该选项后需紧跟输出文件名。(后面会谈到常用选项对应的作用)

在这里插入图片描述

预处理阶段

  • 作用
  • 预处理功能主要包括宏定义,文件包含,条件编译,去注释等。
  • 预处理指令是以#号开头的代码行。
  • 实例: gcc –E code.c –o code.i
  • 选项“-E”,该选项的作用是让 gcc 在预处理结束后停止编译过程。
  • 选项“-o”是指目标文件,“.i”文件为已经过预处理的C原始程序

在这里插入图片描述

编译阶段

  • 在这个阶段中,gcc 首先要检查代码的规范性、是否有语法错误等,以确定代码的实际要做的工作,在检查无误后,gcc 把代码翻译成汇编语言。
  • 用户可以使用“-S”选项来进行查看,该选项只进行编译而不进行汇编,生成汇编代码
  • gcc –S code.i –o code.s

在这里插入图片描述

汇编阶段

  • 汇编阶段是把编译阶段生成的“.s”文件转成目标文件
  • 读者在此可使用选项“-c”就可看到汇编代码已转化为“.o”的二进制目标代码了
  • gcc -c code.s -o code.o

在这里插入图片描述

链接阶段

  • 在成功编译之后,就进入了链接阶段。
  • gcc code.o -o code
  • 链接后生成的也是二进制文件。
    注意
  1. gcc/g++不带-E、-S、-c选项时,就默认生成预处理、编译、汇编、链接全过程后的文件。
  2. 若不用-o选项指定生成文件的文件名,则默认生成的可执行文件名为a.out。

gcc选项汇总

  • -E 只进行预处理,这个不生成文件,你需要把他重定向到一个输出文件里面(否则将把预处理后的结果打印到屏幕上)。
  • -S 编译到汇编语言,不进行汇编和链接,即只进行预处理和编译。
  • -c 编译到目标代码
  • -o 将处理结果输出到指定文件,该选项后需紧跟输出文件名。
  • -static 此选项对生成的文件采用静态链接。
  • -g 生成调试信息(若不携带该选项则默认生成release版本)。
  • -shared 此选项将尽量使用动态库,生成文件较小。
  • -w 不生成任何警告信息。
  • Wall 生成所有警告信息。
  • -O0/-O1/-O2/-O3 编译器优化选项的四个级别,-O0表示没有优化,-O1为缺省值,-O3优化级别最高。

静态库与动态库

  • 静态库是指编译链接时,把库文件的代码全部加入到可执行文件当中,因此生成的文件比较大,但在运行时也就不再需要库文件了,静态库一般以.a为后缀。
  • 动态库与之相反,在编译链接时并没有把库文件的代码加入到可执行文件当中,而是在程序运行时由链接文件加载库,这样可以节省系统的开销,动态库一般以.so为后缀。
    动态链接:
     优点:省空间(磁盘的空间,内存的空间),bin体积小,加载速度快。
     缺点:依赖动态库,程序可移植性较差。
    静态链接:
     优点:不依赖第三方库,程序的可移植性较高。
     缺点:浪费空间。
    **加粗样式**
    我们也可以在最后加上 -static
    在这里插入图片描述
    这也证明了动态链接比较节省空间,而静态链接比较浪费空间。

小tips:如果出现下面这种情况
在这里插入图片描述
//安装指令
sudo yum install glibc -static //c静态库
sudo yum install libstdc++ -static //c++静态库

  • 程序的发布方式有两种,debug模式和release模式
  • Linux gcc/g++出来的二进制程序,默认是release模式
  • 要使用gdb调试,必须在源代码生成二进制程序的时候, 加上-g 选项

在Linux当中gcc/g++默认生成的可执行程序是release版本的,是不可被调试的。如果想生成debug版本,就需要在使用gcc/g++生成可执行程序时加上-g选项。
在这里插入图片描述
gdb使用语法 gdb + 文件名
在这里插入图片描述

gdb命令汇总

调试

  • run/r:运行代码
  • next/n:逐过程调试。
  • step/s:逐语句调试。
  • until 行号:跳转至指定行。
  • finish:执行完当前正在调用的函数后停下来(不能是主函数)。
  • continue/c:运行到下一个断点处。

显示

  • list/l n:显示从第n行开始的源代码,每次显示10行,若n未给出则默认从上次的位置往下显示.。
  • list/l 函数名:显示该函数的源代码。
  • print/p 变量:打印变量的值。
  • print/p &变量:打印变量的地址。
  • print/p 表达式:打印表达式的值,通过表达式可以修改变量的值。
  • display 变量:将变量加入常显示(每次停下来都显示它的值)。
  • display &变量:将变量的地址加入常显示。
  • undisplay 编号:取消指定编号变量的常显示。
  • bt:查看各级函数调用及参数。
  • info/i locals:查看当前栈帧当中局部变量的值。

断点

  • break/b n:在第n行设置断点。
  • break/b 函数名:在某函数体内第一行设置断点。
  • info breakpoint/b:查看已打断点信息。
  • delete/d 编号:删除指定编号的断点。
  • disable 编号:禁用指定编号的断点。
  • enable 编号:启用指定编号的断点。

退出

  • quit/q:退出gdb。

Linux项目自动化构建工具 - make/Makefile

make/Makefile的意义

  • 一个工程的源文件不计其数,按照其类型、功能、模块分别放在若干个目录当中,Makefile定义了一系列的规则来指定:哪些文件需要先编译,哪些文件需要后编译,甚至于进行更复杂的功能操作。
  • Makefile带来的好处就是“自动化编译”,一旦写好,只需一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。
  • make是一条命令,Makefile是一个文件,两个搭配使用,完成项目自动化构建。

使用make/makefile

依赖关系

文件A的变更会影响到文件B,那么就称文件B依赖于文件A。
eg:code.o文件是由code.c文件通过预处理、编译以及汇编之后生成的文件,所以code.c文件的改变会影响code.o,所以说code.o文件依赖于code.c文件。

  • 多个源文件如何编译???在这里插入图片描述
  1. 直接gcc多个源文件进行编译 ,一步到位
  2. 先用每个源文件各自生成自己的二进制文件,然后再将这些二进制文件通过链接生成可执行程序。gcc -c在这里插入图片描述
    若是直接使用源文件生成可执行程序,那么其中一个源文件进行了修改,再生成可执行程序的时候就需要将所以的源文件重新进行编译链接。
    而若是先用每个源文件各自生成自己的二进制文件,那么其中一个源文件进行了修改,就只需重新编译生成该源文件的二进制文件,然后再将这些二进制文件通过链接生成可执行程序即可。
    编译链接的时候不需要加上头文件,因为编译器通过源文件的内容可以知道所需的头文件名字,而通过头文件的包含方式(“尖括号”包含和“双引号”包含),编译器可以知道应该从何处去寻找所需头文件。

在这里插入图片描述
注: 一般将这种clean的目标文件设置为伪目标,用.PHONY修饰,伪目标的特性是:总是被执行。
在这里插入图片描述

原理

  • make会在当前目录下找名字为“Makefile”或“makefile”的文件。
  • 如果找到,它会找文件当中的第一个目标文件,在上面的例子中,它会找到mytest这个文件,并把这个文件作为最终的目标文件。
  • 如果mytest文件不存在,或是mytest所依赖的后面的test.o文件和main.o文件的文件修改时间比mytest文件新,那么它就会执行后面的依赖方法来生成mytest文件。
  • 如果mytest所依赖的test.o文件不存在,那么make会在Makefile文件中寻找目标为test.o文件的依赖关系,如果找到则再根据其依赖方法生成test.o文件(类似于堆栈的过程)。
  • 当然,你的test.c文件和main.c文件是存在的,于是make会生成test.o文件和main.o文件,然后再用test.o文件和main.o文件生成最终的mytest文件。
  • make会一层又一层地去找文件的依赖关系,直到最终编译出第一个目标文件。
  • 在寻找的过程中,如果出现错误,例如最后被依赖的文件找不到,那么make就会直接退出,并报错。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/327466.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

OpenHarmony—编译构建指导

概述 OpenHarmony编译子系统是以GN和Ninja构建为基座,对构建和配置粒度进行部件化抽象、对内建模块进行功能增强、对业务模块进行功能扩展的系统,该系统提供以下基本功能: 以部件为最小粒度拼装产品和独立编译。支持轻量、小型、标准三种系…

大厂咋做支付系统的核对?

核对是保障资金安全的重要机制。 时效角度,主要有: (准)实时核对 准确性不如离线核对,且需相应实时核对平台建设 离线核对(如 T1 核对) 主要问题是发现问题的时机较为后置,部分场景…

微信小程序-----全局配置与页面配置

目录 前言 全局配置文件 一、window 1. 小程序窗口的组成部分 2. window 节点常用的配置项 3. 设置导航栏的标题 4. 设置导航栏的背景色 5. 设置导航栏的标题颜色 6. 全局开启下拉刷新功能 7. 设置下拉刷新时窗口的背景色 8. 设置下拉刷新时 loading 的样式 9. 设置…

蓝桥杯备赛 | 洛谷做题打卡day2

​ 蓝桥杯备赛 | 洛谷做题打卡day2 嵌套循环yyds!! 题目来源:洛谷P2670 [NOIP2015 普及组] 扫雷游戏 题目背景 NOIP2015 普及组 T2 题目描述 扫雷游戏是一款十分经典的单机小游戏。在 n n n 行 m m m 列的雷区中有一些格子含有地雷&am…

跨域请求的API接口调用流程

在Web开发中,前端和后端相互通信是非常常见的需求。通常情况下,前端通过发送HTTP请求调用后端的API接口来获取数据或执行某些操作。然而,由于同源策略的限制,浏览器默认情况下不允许跨域请求,即前端不能直接从一个域名…

48 WAF绕过-权限控制之代码混淆及行为造轮子

目录 Safedog代码层手写及脚本绕过BT Aliyun代码层手写及脚本绕过safedog,BT,Aliyun-基于覆盖加密变异下编码解码绕过-代码层Safedog,BT,Aliyun-基于冰蝎新型控制器绕过全面测试-行为层Safedog,BT,Aliyun-基于手写新型控制器绕过全…

添加 自定义校验方法,让用户自定义校验规则

目录 一、前置说明1、总体目录2、相关回顾3、本节目标 二、操作步骤1、项目目录2、代码实现3、测试代码4、日志输出 三、后置说明1、要点小结2、下节准备 一、前置说明 1、总体目录 《 pyparamvalidate 参数校验器,从编码到发布全过程》 2、相关回顾 添加 常用校…

软件设计师4--寻址方式

软件设计师4--寻址方式 考点1:指令的基本概念考点2:寻址方式例题: 考点1:指令的基本概念 一条指令就是机器语言的一个语句,它是一组有意义的二进制代码,指令的基本格式如下: 操作码字段地址码…

SpringCloud全链路灰度发布

日升时奋斗,日落时自省 目录 1、实现框架 2、负载均衡模块 3、封装负载均衡器 4、网关模块 5、服务模块 5.1、注册为灰度服务实例 5.2、设置负载均衡器 5.3、传递灰度标签 1、实现框架 Spring Cloud全链路灰色发布实现构架: 灰度发布的具体实现…

【C++ Primer Plus】2.1 进入C++

代码示例 #include <iostream> // a preprocessor directive 预处理器指令 int main () // function header { // start of function bodyusing namespace std; // make definitions visiblecout << "hello!"; // message…

动态路由综合实验-RIP

一.要求 1、R1--R3地址为192.168.1.0/24:请合理分配 2、R3的环回为3.3.3.0/24&#xff0c;该网段不能在rip中宣告 3、整个网络使用RIPV2&#xff0c;全网可达&#xff0c;路由表汇总&#xff0c;防止环路&#xff0c;保障更新安全&#xff0c;加快收敛速度 网络拓扑结构&…

服务器感染了.DevicData-P-XXXXXXXX勒索病毒,如何确保数据文件完整恢复?

引言&#xff1a; 在当今数字化时代&#xff0c;勒索病毒已成为网络安全威胁的一个严峻问题。其中&#xff0c;.DevicData-P-XXXXXXXX 勒索病毒以其恶意加密文件的手段引起了广泛关注。本文将介绍该病毒的特点、数据恢复方法以及如何预防遭受其攻击。 如不幸感染这个勒索病毒&…

workflow源码解析:ThreadTask

1、使用程序&#xff0c;一个简单的加法运算程序 #include <iostream> #include <workflow/WFTaskFactory.h> #include <errno.h>// 直接定义thread_task三要素 // 一个典型的后端程序由三个部分组成&#xff0c;并且完全独立开发。即&#xff1a;程序协议算…

【机器学习入门】机器学习基础概念与原理

*&#xff08;本篇文章旨在帮助新手了解机器学习的基础概念和原理&#xff0c;不深入讨论算法及核心公式&#xff09; 目录 一、机器学习概念 1、什么是机器学习&#xff1f; 2、常见机器学习算法和模型 3、使用Python编程语言进行机器学习实践 4、机器学习的应用领域 二…

Dokerfile

阅读目录 什么是dockerfile?Dockerfile的基本结构Dockerfile文件说明 什么是dockerfile? Dockerfile是一个包含用于组合映像的命令的文本文档。可以使用在命令行中调用任何命令。 Docker通过读取Dockerfile中的指令自动生成映像。 docker build命令用于从Dockerfile构建映…

Android studio RecyclerView 应用设计

一、创建empty activity项目: 二、打开activity_main.xml布局文件: 添加RecyclerView控件 <?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/…

Spring Boot - Application Events 同步 VS 异步 发布订阅事件实战

文章目录 PreCode基础工程启动类切入口事件 发布事件同步 Listener异步Listener增加EnableAsync增加 Async 测试 Pre Spring Boot - Application Events 的发布顺序_ApplicationStartingEvent Spring Boot - Application Events 的发布顺序_ApplicationEnvironmentPreparedEv…

手机与电脑更改IP地址怎么使用代理IP?

在现代互联网时代&#xff0c;代理IP已成为许多人日常生活和工作中不可或缺的一部分。通过代理IP&#xff0c;用户可以隐藏自己的真实IP地址&#xff0c;并获得更好的网络体验。本文将详细介绍如何在手机和电脑上更改IP地址并使用代理IP。 一、手机使用代理IP 1. 打开手机设置&…

目标检测DETR:End-to-End Object Detection with Transformers

NMS 对一个目标生成了多个检测窗口&#xff0c;但是事实上这些窗口中大部分内容都是重复的&#xff0c;找到目标检测最优的窗口 选取多个检测窗口中分数最高的窗口&#xff0c;剔除掉其他同类型的窗口 anchor generator 首先在该点生成scale512, aspect ratio{1:2&#xff…

第10章 通信业务

文章目录 10.1.1 通信行业1、通信行业的界定2、通信行业的特点 10.1.2 通信企业10.1.3 通信终端1、通信终端的分类2、终端发展趋势 10.2.1 通信业务的定义及分类10.2.2 基础电信业务1、第一类基础电信业务A11 固定通信业务A12 蜂窝移动通信业务A13 第一类卫星通信业务A14 第一类…
最新文章