Linux基本开发工具

news2024/11/23 15:32:56

编译器和自动化构建工具

  • 一、编译器——gcc、g++
    • 1. 安装 gcc/g++
    • 2. 使用
    • 3. 链接库
    • 4. 拓展命令:od/file/ldd/readelf
  • 二、自动化构建项目——make、makefile
    • 1. 介绍
    • 2. 使用
      • 例子
      • touch——change file timestamps
        • stat——display file or file system status
        • 修改时间
      • .PHONY和makefile中常用符号@
        • 引入.PHONY
        • 使用
        • makefile中常用符号
    • 3. 原理
  • 三、调试器——gdb
    • 1. 安装
    • 2. 使用
      • 背景
      • 准备工作
      • 调试

一、编译器——gcc、g++

gcc和g++的用法一样。主要就是gcc编译C语言的代码,g++编译的C++代码(也可以编译C语言,但是不建议)。所以下面的介绍以gcc为例。

1. 安装 gcc/g++

安装gcc

  • yum install -y gcc

安装g++

  • yum install -y gcc-g++ libstdc++-devel

2. 使用

语法:gcc [选项] [要编译的文件] [选项] [目标文件]
选项:

  • -o:生成的可执行文件,指定名称
  • -static:对生成的文件采用静态链接(链接库讲)
  1. -E:让gcc在预处理结束后停止编译,生成的后缀为.i的文件是经过预处理的原始程序
  2. -S:进行编译不进行汇编,生成的后缀为.s的文件是编译生成的汇编语言
  3. -c:进行汇编操作,生成的后缀为.o的目标文件(可重定位目标二进制文件)是汇编后生成的二进制语言

在之前的程序运行和预处理博客中介绍了改内容,可以回顾一下。

直接编译生成:
直接编译生成

预处理:
预处理

编译:
编译
汇编:
汇编

链接:
链接

说明:既然是链接形成,那需要链接什么呢?将函数的声明和函数的定义联系起来。例如在我们的代码中调用printf函数,但是在stdio.h中只有函数的声明,而函数的实现定义在链接函数库中。

软件:
在这里插入图片描述

3. 链接库

源文件在生成可执行程序时,这一步中重要步骤就是链接函数库。而链接库一般分为两种:静态链接库动态链接库

C/C++静态库安装:

C语言静态库安装:yum install -y glibc-static
C++语言静态库安装:yum install -y libstdc++-static

静态链接库:

编译链接时,把库文件的代码全部加入到可执行文件中,因此生成的文件比较大。生成后链接库被删除依旧会正常运行。其后缀名一般为".a"

动态链接库:

编译连接时没有把库文件的代码加入到可执行文件中,而是程序运行时链接文件加载库。节省了系统开销,但是一旦链接库被删除,程序无法运行。其后缀名一般为".so"

产生的可执行文件体积比较:
文件大小

后缀:

动态库后缀静态库后缀
Linux.so.a
Windows.dll.lib

拓展:

  1. libname.so.xxx 其中name就是库的名称
  2. C语言标准库:本质就是文件
  3. 在CentOS7.6,库文件存放在/usr/lib64路径下

注意:

  1. Linux默认生成的二进制程序是使用动态库(共享库),想要使用静态库,则在选项中加-static选项。eg:gcc [源文件] -o [目标程序] -static这个目标程序体积会变大。
  2. 如果没有动态库,只有静态库,不加-static,也可以编译生成可执行文件。
    -static: 本质改变优先级
  3. 一个程序可以混合使用动静态库,但是加-static所有链接库要求全变成静态库。

4. 拓展命令:od/file/ldd/readelf

od [filename]命令是一个在Linux系统上用于查看文件的八进制或十六进制表示的工具。它可以读取filename并以指定格式呈现filename内容,用于分析filename的二进制表示,特定的文件分析和调试任务,比如查看文件的特定字节、检查文件的编码或字符集等

file [filename]命令用于确定给定文件的类型。它通过检查文件的魔术数字(magic number)或文件内容的特征来推断文件的类型。这对于确定一个文件是文本文件、二进制文件还是可执行文件非常有用。可以判断是静态链接还是动态链接
file

ldd [filename]命令用于显示一个可执行文件或共享库所依赖的共享库。可以列出一个二进制文件运行所需的所有动态链接共享库,并提供它们的路径。可以解决缺失的动态链接库或版本冲突的问题。
ldd

readelf [选项] [filename]命令用于显示一个可执行文件或共享库的ELF(可执行与链接格式)格式信息。可以获取有关目标文件(例如二进制文件或库)的很多信息,如文件类型、机器体系结构、节头表、符号表等。readelf命令用于调试和分析目标文件,了解文件的内部细节和元数据。
readelf

注意: 可执行程序形成的时候,不是无序的二进制构成,有自己的格式—ELF格式

二、自动化构建项目——make、makefile

1. 介绍

make是一条命令,makefile是一个文件,两者搭配使用完成项目自动化构建。

  1. make这一命令的作用是解释makefile中指令的命令工具。
  2. makefile作用就是“自动化编译”,因为一个工程中源文件很多,其按类型、功能和模块分别放在若干目录,makefile制定了一些列的规则来指定,文件编译的先后顺序,是否需要重新编译等功能。一旦写好makefile一个make指令,整个工程完全自动完成编译

2. 使用

例子

makefile文件包含:依赖关系依赖方法
使用

touch——change file timestamps

stat——display file or file system status

语法:stat [文件]
展示信息:包括文件的跟踪信息、大小、链接数、所有者、组、权限、状态更改时间、访问时间等,快速了解文件的基本属性
test属性

修改时间

语法:touch [选项] [filename]
选项:

  • -a:修改Access时间
  • -m:修改Modify时间
  • -d:设定时间与日期,可以使用各种不同的格式
  • -t: 设定档案的时间记录,格式与 date 指令相同

1. 更新Access时间: touch -a [filename]
Access

2. 更新Modify时间: touch -m [filename]
Modify

3. 修改Access和Modify为指定时间:

  1. touch -d [filename]
    -d选项两种方式
  2. touch -t [filename]
    -t选项

点到为止,这是为下一个.PHONY知识点服务的内容

.PHONY和makefile中常用符号@

引入.PHONY

1. 现象: 连续的make没有被执行
在这里插入图片描述
2. 实验:
实验
3. 结论:
当test的Modify时间比依赖关系的源文件test.c的Modify时间更新,make就不会执行,反之就会继续执行。(注意:这里时间比较方式使用时间戳来比较)

使用

如果不通过更改源文件Modify时间的方式,能不能持续make呢?答案:肯定是可以的。

那就需要把它设置成为目标,用.PHONY修饰。为目标的特性:总是被执行的
语法:.PHONY [目标文件]
演示:当然具体使用时不是这样去使用
演示

一般使用:这样clean就总是被执行了
使用

makefile中常用符号

$@替换了依赖关系中:左侧的内容
$^替换了依赖关系中:右侧的内容
注意:我们日常需要编译的源文件可能很多,如果自己添加会很麻烦,使用符号代替就算新增或删除源文件等行为,都不需要进行修改
符号

在依赖方法前添加@符号,是在make执行是,不在屏幕上进行回显
符号

使用效果:
在这里插入图片描述

3. 原理

当只输入make指令时的工作原理

  1. make命令会在当前目录下寻找makefile/Makefile(这两个文件名都可以找得到)文件。
  2. 找到之后,会找makefile中第一个目标文件,也就是上例中的test,并把这个文件当作最终的目标文件
  3. 如果这个最终文件不存在,并且所依赖的test.c文件的Modify的时间要比test文件新,则它就会执行后面定义的依赖方法来生成test文件
  4. 如果test所依赖的test.c文件不存在,那么make会在当前文件找test.c文件的依赖性,如果找到则生成,然后返回到上一步骤(有点像堆栈调用)

注意:在寻找过程中,如果依赖文件找不到则直接报错,对于所定义的命令错误,或编译不成功,make根本不理。如果不需要依赖文件,就如同上例中的clean,就直接执行依赖方法。

三、调试器——gdb

1. 安装

yum install -y gdb

2. 使用

背景

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

准备工作

安装gdb:yum install -y gdb

被调试的代码:
被调试的代码

makefile中的代码:
makefile

查看可执行程序debug信息:
查看可执行程序debug信息

调试

语法:gdb [可执行文件]
调试时使用的命令:

  • Ctrl + d 或 quit(q):退出
  • list(l) [行号]:显示改行前后的代码,一次显示十行。下次不输入指令直接回车,接着上次的位置往下列。
  • list(l) [函数名]:列出该函数的源代码
  • break(b) [行号]:在改行设置断点
  • break(b) [函数名]:在函数开头设置断点(有效代码处)
  • info break(b):查看断点信息
  • disable breakpoints:禁用断点(注意breakpoints是查看断点信息最前面Num那一列的数字
  • enable breakpoints:启用断点
  • run( r ):运行程序(相当于vs 2019中的F5)
  • continue( c ):执行到下一个断点
  • next(n):单条执行(相当于vs 2019中的F10) 逐过程
  • step(s):进入函数调用(相当于vs 2019中的F11)逐语句
  • print( p ) [变量名]:打印表达式的值,通过表达式可以修改变量的值或调用函数
  • display [变量名]:跟踪查看变量,每次停下来都显示它的值(监视窗口)
  • undisplay:取消对先前设置变量的跟踪(可以指定编号——也是在最前面一列)
  • until [行号]:执行到改行
  • breaktrace(bt):查看函数栈帧
  • delete breakpoints:删除所有断点(可以跟序号,指定删除某一断点)
  • finish:执行到当前函数返回
  1. list(l)
    list(l)

  2. break(b) / info break(b) / disable breakpoints / enable breakpoints / run( r ) / continue( c )
    断点

  3. next(n) / step(s)
    逐过程、逐语句

  4. print( p )
    p

  5. display / undisplay
    监视窗口

  6. until
    until

  7. breaktrace(bt)
    breaktrace

  8. delete breakpoints
    delete breakpoints

  9. finish
    finish

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

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

相关文章

SpringBoot2—开发实用篇1

目录 热部署 手动启动热部署 自动启动热部署 热部署范围配置 关闭热部署 配置高级 测试 热部署 什么是热部署?简单说就是你程序改了,现在要重新启动服务器,嫌麻烦?不用重启,服务器会自己悄悄的把更新后的程序给…

大模型时代-怎么正确的开发和使用AI模型

一、背景 大模型的概念已经经过了一年的发酵,大家也渐渐的冷静下来了。一开始大家很兴奋,感觉新的时代要来了,然后就是疯狂,再就是都各自找各自公司的东西怎么与大模型沾点边,要不然今年玩不下去了,就要落伍…

数据结构和算法 - 数组

1、数组 1.1 简介 什么是数组? 他优缺点是什么?具体应用有哪些? 「数组 array」是一种基于顺序存储的线性数据结构,其将相同类型的元素存储在连续的内存空间中。我们将元素在数组中的位置称为该元素的「索引 index」。 如图&…

生产问题排查思路

生产上有用户反映,登录之后页面信息加载不出来,请求响应时间慢等。 下图为生产上一个请求在网关上面的流程: 因为我们生产上,有一张异常信息记录表,第一时间查询了上面是否有最近的异常记录。发现了一点,是…

vue整个页面可以拖拽导入文件

效果图 原理与源码 我们这里的思路是用ant组件库的upload组件,就是如下这个 用这个包裹住所有页面,你可以是包裹住App.vue,或者是你的homepage。但是这个涉及到一个问题,就是我们现在确实是可以拖拽导进来文件了,但是…

【Stm32-F407】Keil uVision5 下新建工程

①双击鼠标左键打开Keil uVision5,选择 Project 下的 New uVision Project ; ②在期望的文件夹下创建一个工程,并按如下要求操作; ③添加文件类型,按如下要求操作 ④如有需要可添加相关启动文件在工程文件夹下并添加到…

WEB 3D技术 以vue3+vite环境为例 讲解vue项目中使用three

上文 WEB 3D 技术,通过node环境创建一个three案例 中 我们打造了自己的第一个Web 3D界面 那么 今天 我们就来结合vue来开发我们的3D界面 这里 我们先创建一个文件夹 作为文件目录 千万不要放C盘 我们 依旧是在终端执行命令 npm init vitelatest输入一下项目名称 …

[GWCTF 2019]我有一个数据库1

提示 信息收集phpmyadmin的版本漏洞 这里看起来不像是加密应该是编码错误 这里访问robots.txt 直接把phpinfo.php放出来了 这里能看到它所有的信息 这里并没有能找到可控点 用dirsearch扫了一遍 ####注意扫描buuctf的题需要控制扫描速度,每一秒只能扫10个多一个都…

vue2 echarts不同角色多个类型数据的柱状图

前端代码&#xff1a; 先按照echarts插件。在页面里引用 import * as echarts from "echarts";设置div <div style"width:100%;height:250px;margin-top: 4px;" id"addressChart"></div>方法: addressEcharts() {const option {g…

vue 将后端返回的二进制流进行处理并实现下载

什么是二进制流文件&#xff1f; 二进制文件是一种计算机文件格式&#xff0c;它的数据以二进制形式存储&#xff0c;与文本文件不同。二进制文件可以包含任意类型的数据&#xff0c;例如图像、音频、视频、可执行文件、压缩文件等&#xff0c;而文本文件则仅仅包含 ASCII 码或…

<JavaEE> 网络编程 -- 网络通信基础(协议和协议分层、数据封装和分用)

目录 一、IP地址 1&#xff09;IP地址的概念 2&#xff09;IP地址的格式 二、端口号 1&#xff09;端口号的概念 2&#xff09;端口号的格式 3&#xff09;什么是知名端口号&#xff1f; 三、协议 1&#xff09;协议的概念 2&#xff09;协议的作用 3&#xff09;TC…

Python (八)网络编程

程序员的公众号&#xff1a;源1024&#xff0c;获取更多资料&#xff0c;无加密无套路&#xff01; 最近整理了一份大厂面试资料《史上最全大厂面试题》&#xff0c;Springboot、微服务、算法、数据结构、Zookeeper、Mybatis、Dubbo、linux、Kafka、Elasticsearch、数据库等等 …

RT-Smart 官方 aarch64 平台 musl gcc 工具链下载

前言 RT-Smart 的开发离不开 musl gcc 工具链&#xff0c;用于编译 RT-Smart 内核与用户态应用程序 RT-Smart 当前的 musl gcc 工具链未开源&#xff0c;但可以下载到 官方 最新的 musl gcc 工具链 aarch64 平台 比如 RT-Smart 最好用的 qemu 平台&#xff1a; qemu-virt64-…

龙迅# LT9211C 是一款高性能转换器,可在 MIPI DSI/CSI-2、双端口 LVDS 和 TTL 之间进行互转换,分辨率高达4K30HZ。

1. 描述LT9211C 是一款高性能转换器&#xff0c;可在 MIPI DSI/CSI-2、双端口 LVDS 和 TTL 之间进行互转换&#xff0c;但 24 位 RGB TTL 到 24 位 RGB TTL 除外。不建议在 2 端口 10 位 LVDS 和 24 位 RGB TTL 之间进行转换。LT9211C对输入的MIPI/LVDS/TTL视频数据进行反串&am…

fl studio2024中文版下载安装教程 亲测有效

fl studio是一款功能强大的编曲软件&#xff0c;今天小编就为大家带来了详细的安装教程&#xff0c;需要的朋友一起看看吧&#xff01;fl studio2024是一款功能强大的编曲软件&#xff0c;也就是众所熟知的水果软件。它可以编曲、剪辑、录音、混音&#xff0c;让您的计算机成为…

【ProcessOn】流程图咏道图Axure自定义元件使用----含流程图案例

目录 一&#xff0c;ProcessOn 1.1 ProcessOn是什么 1.2 ProcessOn应用场景 1.3 流程图 1.4 泳道图简介 1.5 Process网址与界面简介 二&#xff0c;流程图案例 2.1 门诊流程图 2.2 住院流程图 2.3 药房药库流程图 2.4 会议OA流程图 三&#xff0c;Axure自定义元件 …

WPF Icon矢量库 MahApps.Metro.IconPacks

文章目录 前言MahApps.Metro.IconPacksIconPacks.Browser简单使用简单使用案例代码Icon版本个人推荐 Icon自定义版权问题 前言 为了更快的进行开发&#xff0c;我找到了一个WPF的矢量图库。这样我们就不用去网上找别人的矢量库了 MahApps.Metro.IconPacks MahApps.Metro.Icon…

手机笔记如何添加文件 在笔记中添加文件方法

在忙碌的工作和生活中&#xff0c;我经常需要记录一些重要的笔记&#xff0c;并且需要添加一些相关的文件以便查阅。但是&#xff0c;我发现很多笔记软件并不支持添加文件&#xff0c;这让我感到非常困扰。 有一次&#xff0c;我需要记录一个会议的重要内容&#xff0c;并且需…

【问题处理】—— lombok 的 @Data 大小写区分不敏感

问题描述 今天在项目本地编译的时候&#xff0c;发现有个很奇怪的问题&#xff0c;一直提示某位置找不到符号&#xff0c; 但是实际在Idea中显示确实正常的&#xff0c;一开始以为又是IDEA的故障&#xff0c;所以重启了IDEA&#xff0c;并执行了mvn clean然后重新编译。但是问…

VBA技术资料MF95:打开工作薄后自动定位某个工作表

我给VBA的定义&#xff1a;VBA是个人小型自动化处理的有效工具。利用好了&#xff0c;可以大大提高自己的工作效率&#xff0c;而且可以提高数据的准确度。我的教程一共九套&#xff0c;分为初级、中级、高级三大部分。是对VBA的系统讲解&#xff0c;从简单的入门&#xff0c;到…