【Linux工具】编译器、调式器、项目自动化构建工具以及git的使用(1编译器)

news2024/11/30 6:56:30

【Linux工具】编译器、调式器、项目自动化构建工具以及git的使用(1)

目录

  • 【Linux工具】编译器、调式器、项目自动化构建工具以及git的使用(1)
      • Linux编译器-gcc/g++使用
      • gcc的编译过程
          • 预处理(进行宏替换)
          • 编译(生成汇编)
          • 汇编(将汇编语言变成机器可识别代码(二进制文件))
          • 链接(生成可执行文件或库文件)
      • 函数库
          • file指令(直接查看程序)
      • debug(开发版)&&release(发布版)

作者:爱写代码的刚子
时间:2023.6.3
本篇博客主要详细介绍Linux中十分重要的工具:编译器,灵活使用这些工具是Linux中一项必备技能。项目自动化构建工具、调式器、git工具会在下一篇博客中进行介绍。

Linux编译器-gcc/g++使用

gcc编译C语言:
在这里插入图片描述

g++编译C++:

在这里插入图片描述

  • gcc只能编译C语言,而g++可以编译C语言也可以编译C++,编译生成的可执行文件默认文件名都是a.out,后一个a.out会覆盖前一个a.out(我们用gcc/g++ -o的选项重命名就不会重名且覆盖了)

gcc的编译过程

预处理(进行宏替换)

预处理的主要步骤:
a.去注释
b.头文件展开
c.条件编译(C语言的学习中认识过,以是否定义该宏为条件进行代码的裁剪,可以用于不同版本的软件裁剪对应的功能)
d.宏替换

  1. 预处理功能主要包括宏定义,文件包含,条件编译,去注释等。
  2. 预处理指令是以#号开头的代码行。
  3. 实例: gcc –E hello.c –o hello.i
  4. 选项“-E”,该选项的作用是让 gcc 在预处理结束后停止编译过程。
  5. 选项“-o”是指目标文件,“.i”文件为已经过预处理的C原始程序。
  • gcc -E caogao.c -o caogao.i生成预处理文件(其中==-E的意思是:从现在开始进行程序的翻译,将预处理工作做完就停止==)

在这里插入图片描述
在这里插入图片描述
【问题】:为什么能够在windows或者Linux上进行C/C++或者其他形式的开发呢?
我们的系统中一定要提前或者后续安装上C/C++开发相关的头文件,库文件,C/C++开发环境不仅仅指的是vs、gcc、g++,更重要的是语言本身的头文件和库文件(安装vs2019、vs2022等,选择了对应的开发包,同步也在下载C的头文件和库文件,所以编译器不用#include </usr/include/stdio.h>,因为编译器已经知道了头文件的默认路径,所以直接使用#include <stdio.h>即可)

  • **ls /usr/include/**查看Linux中的头文件,/usr/include/是gcc或者g++搜索头文件时默认的路径
    在这里插入图片描述
    用vim打开头文件:
    在这里插入图片描述
    在这里插入图片描述
  • gcc -E caogao.c -o caogao.i -DDEBUG可以直接使用gcc指令来定义宏DEBUG(编译器具有直接修改代码的能力)
    在这里插入图片描述
  • 预处理过后还是C语言
编译(生成汇编)
  1. 在这个阶段中,gcc 首先要检查代码的规范性、是否有语法错误等,以确定代码的实际要做的工作,在检查
  2. 无误后,gcc 把代码翻译成汇编语言。
  3. 用户可以使用“-S”选项来进行查看,该选项只进行编译而不进行汇编,生成汇编代码。
  4. 实例: gcc –S hello.i –o hello.s
  • gcc -S caogao.c -o caogao.s生成对应的汇编文件(其中-S的意思是:从现在开始进行程序的翻译,将编译工作做完就停下来
    在这里插入图片描述
汇编(将汇编语言变成机器可识别代码(二进制文件))
  1. 汇编阶段是把编译阶段生成的“.s”文件转成目标文件
  2. 读者在此可使用选项“-c”就可看到汇编代码已转化为“.o”的二进制目标代码了
  3. 实例: gcc –c hello.s –o hello.o
  • gcc -c caogao.s -o caogao.o 将汇编语言变成二进制文件(-c的意思是:从现在开始进行程序的翻译,将汇编工作做完就停下来
    在这里插入图片描述
  • 其中生成的.o文件我们称为可重定位目标二进制文件。简称目标文件(.obj文件)虽然已经是二进制,但是并不能独立执行,还需要经过链接,有可执行权限但是没有可执行能力。
    在这里插入图片描述

由于是二进制文件,所以用vim(文本编辑器,只能识别文本)打开时会出现乱码
在这里插入图片描述

  • od caogao.o用od(二进制查看工具)来查看二进制文件
    在这里插入图片描述
链接(生成可执行文件或库文件)
  1. 在成功编译之后,就进入了链接阶段。
  2. 实例: gcc hello.o –o hello
  • gcc caogao.o -o caogao.exe进行链接,生成可执行文件(将可重定位目标二进制文件,和库进行链接形成可执行程序)
    在这里插入图片描述

函数库

我们的C程序中,并没有定义“printf”的函数实现,且在预编译中包含的“stdio.h”中也只有该函数的声明,而
没有定义函数的实现,那么,是在哪里实“printf”函数的呢?
最后的答案是:系统把这些函数实现都被做到名为 libc.so.6 的库文件中去了,在没有特别指定时,gcc 会到系统默认的搜索路径“/usr/lib”下进行查找,也就是链接到 libc.so.6 库函数中去,这样就能实现函数“printf”了,而这也就是链接的作用

C语言标准库给我们提供方法的实现,库的本质是一个文件,存在路径

  • Linux下: .so(动态库) .a(静态库)
  • Windows:.dll(动态库) .lib(静态库)
    库也有自己的命名规则libname .so.XXX (name是库真正的名字)

在这里插入图片描述
在这里插入图片描述

默认机器上安装了动态库,默认没有安装静态库

方法的实现在库中,库其实是把.c文件(源文件),经过一定的翻译,然后打包——只给你提供一个文件即可,不用提供太多的源文件,也可以达到隐藏源文件的目的。

  • 在编译器使用静态库进行静态链接的时候,会将自己的方法拷贝到目标程序中,该程序以后不用再依赖静态库!
  • 动态库不能缺失,一旦对应的动态库缺失,影响的不止一个程序,可能导致很多程序都无法进行正常运行!
    在Linux中,编译形成的可执行程序默认采用的就是动态链接——要求系统提供动态库

【-static选项】:

  • gcc caogao.c -o caogao_static -static采用静态链接进行编译可执行程序
    在这里插入图片描述
    采用静态链接进行编译的可执行程序明显比采用动态链接进行编译的可执行程序要大

静态链接:
在这里插入图片描述
动态链接:
在这里插入图片描述

  • 在Linux中,编译形成可执行程序,默认采用的就是动态链接——需要动态库
  • 在Linux系统中,如果要按照静态链接的方式,进行形成可执行程序,需要添加-static选项——需要静态库

一般Linux服务器上默认装了动态库而没有装静态库,无论是C还是C++。

附:如何在Linux服务器上安装静态库?
安装C语言静态库:
输入指令:(sudo) yum install -y glibc-static

在这里插入图片描述
安装C++静态库:
输入指令:(sudo) yum install -y libstdc+±static
在这里插入图片描述

【问题】

  • 如果我们没有静态库,但是我们就是要用-static进行静态链接可以吗?【不行】
  • 如果我们没有动态库,只有静态库,而且gcc能找到,可以进行编译吗?【可以】gcc默认优先动态链接,-static的本质是改变优先级
  • 所以可执行程序不一定全部都是动态链接或者静态链接,可能是混合的。但是如果我们加了-static就会默认将所有的链接要求全部变成静态链接,-static只适配一次
file指令(直接查看程序)

在这里插入图片描述
在这里插入图片描述

动态库vs静态库

  • 动态库因为是共享库,有效地节省资源(磁盘空间,内存空间,网络空间等)【优】动态库一旦缺失,导致各个程序都无法运行【缺点】
  • 静态库,不依赖库,程序可以独立运行【优点】,体积大,比较消耗资源【缺点】

debug(开发版)&&release(发布版)

  • 发布debug:
  1. 可以被追踪调试
  2. 形成可执行程序的时候,添加了debug信息(比release版本要大)
    在这里插入图片描述
  • readelf -S caogao1_d将我们的可执行程序按照空间布局情况和数据区以段的形式呈现
    在这里插入图片描述

查看可执行程序是不是debug版本

  • readelf -S caogao.exe | grep -i debug过滤一下debug信息发现没有
    在这里插入图片描述

  • readelf -S caogao1_d | grep -I debug caogao1_d存在debug信息
    在这里插入图片描述

补充:形成可执行的程序时并不是无序的二进制,而是有自己的格式(ELF格式)

之后可以通过《程序员的自我修养》、《深入理解计算机系统》加深了解。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2023/6/8总结

MySQL必知必会 commit 和 rollback 的差异是commit会提交&#xff0c;而rollback不会&#xff0c;就好像是撤回。 使用保留点&#xff1a; 简单的rollback和commit语句就可以写入或者撤销整个事务处理&#xff0c;但是&#xff0c;只是对简单的事务处理才能这样做&#xff0…

chatgpt赋能python:Pythontypedef:介绍及使用方法

Python typedef: 介绍及使用方法 Python作为一种高级编程语言&#xff0c;支持定义类型别名&#xff0c;可以给现有类型起一个新的名字&#xff0c;从而提高代码的可读性和可维护性。在本文中&#xff0c;我们将介绍Python中的typedef概念及其使用方法。 什么是Python typede…

BiFormer实战:使用BiFormer实现图像分类任务(二)

文章目录 训练部分导入项目使用的库设置随机因子设置全局参数图像预处理与增强读取数据设置Loss设置模型设置优化器和学习率调整算法设置混合精度&#xff0c;DP多卡&#xff0c;EMA定义训练和验证函数训练函数验证函数调用训练和验证方法 运行以及结果查看测试热力图可视化展示…

【新申请】新SRRC容易Fail点分享 2.4G和5.8G的干扰规避判定方法

新SRRC容易Fail点分享 一、2.4G 产品针对于高信道边带变严格了&#xff0c;在之前带外杂散limit为-80dBm/Hz的基础上增加了一段2483.5MHz-2500MHz限值为-40dBm/MHz, 计算可得-100dBm/Hz, 限值严格了20dB。 二、2.4G和5.8G低频发射杂散变严&#xff0c;新规2.4G和5.8G限值变为…

三相PWM整流器有限集模型预测电流控制MATLAB仿真模型

三相PWM整流器有限集模型预测电流控制MATLAB仿真模型-Matlab文档类资源-CSDN文库https://download.csdn.net/download/weixin_56691527/87881809模型简介&#xff1a; 整流器交流侧为三相对称电压&#xff0c;220V/50Hz&#xff0c;直流侧为760V&#xff0c;且电压可调。其中模…

Java 八股文-基础篇

Java 基础 一、Java 概述 1.什么是 Java&#xff1f; Java 是一门面向对象的编程语言&#xff0c;不仅吸收了 C语言的各种优点&#xff0c;还摒弃了 C里难以理解的多继承、指针等概念&#xff0c;因此 Java 语言具有功能强大和简单易用两个特征。Java 语言作为静态面向对象编…

树莓派安装 VScode 与卸载 VScode

0. 实验准备 一个带有系统的树莓派&#xff08;有屏幕更好&#xff09; 一台联网的电脑&#xff0c;且可以使用 VNC 登录树莓派&#xff08;与屏幕二选一&#xff09; 一个可以与树莓派交互文件的软件、如&#xff1a;MobaXterm&#xff08;推荐&#xff09;、WinSCP 1. 获取…

ch7_1指令系统

计算机硬件与软件之间的接口&#xff0c; 指令系统。 1.机器指令 1.1 指令的格式 指令的格式是什么&#xff1f; 操作码&#xff0c;地址码&#xff0c;寻址方式&#xff1b; 指令的字长&#xff0c;可以分为固定字长&#xff0c;可变字长&#xff1b; 操作码的长度可以是…

chatgpt赋能python:Python下Maskout

Python下Maskout Python下Maskout是一种图像处理技术&#xff0c;用于去除图像中的特定区域或对象。Maskout通常用于图像分割&#xff0c;图像合成&#xff0c;深度学习等方面&#xff0c;在许多应用程序中都有很高的需求。本文将向您介绍Python下如何实现Maskout&#xff0c;…

读改变未来的九大算法笔记07_搜索引擎

1. 车库轶事 1.1. 1939年 1.1.1. 戴夫休利特&#xff08;Dave Hewlett&#xff09; 1.1.1.1. 惠普&#xff08;Hewlett-Packard&#xff09; 1.2. 1976年 1.2.1. 蒂夫乔布斯&#xff08;Steve Jobs&#xff09;和史蒂夫沃兹尼亚克&#xff08;Steve Wozniak&#xff09; …

chatgpt赋能python:PythonPip(包管理器):即插即用的方式

Python Pip&#xff08;包管理器&#xff09;: 即插即用的方式 Python Pip是Python的包管理器&#xff0c;目的是为了简化Python包的安装和管理。Python Pip让用户可以轻松地添加、更新和删除Python包。 安装Pip 在安装Python的时候&#xff0c;一般情况下&#xff0c;Pip就…

遗留的 AppSec 工具迷失在云端

随着应用程序开发步伐的加快&#xff0c;IT 和安全团队正在对旧的应用程序安全(AppSec) 工具失去信心。 根据 Backslash 对 300 名 CISO、AppSec 经理和工程师的调查&#xff0c;遗留工具无法跟上并陷入永远的追赶游戏。 影响是深远的&#xff0c;大多数组织都看到云原生 App…

2023中兴捧月图像赛道-任意尺度盲超分初赛第三方案

任意尺度盲超分-初赛第三方案 吐槽篇方案篇一、左脚踩右脚二、梯度攻击 建议篇 吐槽篇 正文内容.正式讲述方案之前&#xff0c;容我先吐槽两句&#xff0c;真tm的是比赛&#xff0c;纯纯ex人。学历厂就别打着以赛招聘的口号&#xff0c;要985计算机的直接去他们学校里宣讲嘛&am…

限制docker日志

为啥要清理服务器上docker容器的日志&#xff1f; 因为是服务器的磁盘空间资源有限&#xff0c;由于docker容器在启动的时候没有限制&#xff0c;导致运行的docker容器随着时间的推移产生的日志越来越多&#xff0c;最后把服务磁盘资源耗尽&#xff0c;服务器的磁盘满了会导致…

MySQL实战:如何设计一个常用的后台管理系统的数据库结构

部分数据来源&#xff1a;ChatGPT 什么是后台管理系统&#xff1f; 后台管理系统是指用于管理和维护网站或应用程序的后台界面系统&#xff0c;通常包含用户管理、权限管理、数据管理等功能&#xff0c;能够方便快捷地管理网站或应用程序。常见的后台管理系统有Cms、OA等&am…

元素的alt和title属性相关细节知识

文章目录 I. 引言alt和title属性的作用和原理元素的alt和title属性的区别 II. 元素的alt属性元素的alt属性alt属性的作用alt属性的使用场景引用实例说明alt属性的应用 III. 元素的title属性元素的title属性title属性的作用title属性的使用场景引用实例说明title属性的应用 IV. …

chatgpt赋能python:Python新手必备:如何下载Jupyter

Python新手必备&#xff1a;如何下载Jupyter 如果你正在寻找一个强大而简单的Python编程环境&#xff0c;那么Jupyter可能是你需要的软件。Jupyter是一种交互式的编程环境&#xff0c;让你可以在浏览器中创建和共享笔记本&#xff0c;适合编写数据分析、机器学习、人工智能等方…

chatgpt赋能python:Python编程必备之OpenCV库下载与安装

Python编程必备之OpenCV库下载与安装 作为目前最热门的计算机视觉库之一&#xff0c;OpenCV在人工智能领域中发挥着巨大的作用。而Python作为一门强大的编程语言&#xff0c;在OpenCV的使用上也有其独特的优势。本文将介绍Python如何下载和安装OpenCV库&#xff0c;以及如何引…

chatgpt赋能python:Pythonpip安装库教程

Python pip安装库教程 Python是一个高级编程语言&#xff0c;具有丰富的库和模块&#xff0c;而pip是Python官方推荐的包管理工具&#xff0c;可以轻松地安装、升级和卸载各种库。 什么是pip pip是Python包管理工具&#xff0c;用于安装Python中的第三方库。pip可以轻松地安…

⑦电子产品拆解分析-6600mA充电宝

⑦电子产品拆解分析-6600mA充电宝 一、功能介绍二、电路分析以及器件作用1、锂电池充放电和USB输出2、主控IC部分电量 三、数据资料汇总以及参考 一、功能介绍 ①提供USB的5V1A和5V2A功率输出&#xff1b;②充电使用micro USB对锂电池充电&#xff1b;③充电宝总容量6600MA电量…