【Liunx】基础开发工具的使用介绍-- yum / vim / gcc / gdb / make

前言
本章将介绍Linux环境基础开发工具的安装及使用,在Linux下安装软件,编写代码,调试代码等操作。

目录

    • 1. yum 工具的使用
      • 1.1 什么是软件包:
      • 1.2 如何下载软件:
      • 1.3 配置国内yum源:
    • 2. vim编辑器
      • 2.1 vim的安装
      • 2.2 vim的三种模式
    • 3. gcc / g++ 编译器
      • 3. 1 编译的处理阶段
      • 3. 2 使用gcc生成静态库及静态库的使用方法:
      • 3. 3 gcc的编译选项:
    • 4. gdb 编译器
      • 4.1 背景介绍
      • 4.2 gdb的操作指令
    • 5. make / Makefile
      • 5.1 makefile的介绍
      • 5.2 如何判断是否重新生成:
      • 5.3 多文件的makefile
    • 6. Linux第一个程序 —— 进度条
      • 6.1 回车和换行的概念:
      • 6.2 缓存区的概念:

1. yum 工具的使用

在Linux中安装软件:

  • 源代码安装,
  • rpm包安装
  • yum安装

其中源代码安装和rpm安装并不简单,当依赖别的库时,还需要下载其他的库,Windows是直接打包好了的。

yum安装的好处:不用编译源码,不用解决软件的依赖关系。

1.1 什么是软件包:

  • 在Linux下安装软件, 一个通常的办法是下载到程序的源代码, 并进行编译, 得到可执行程序.
  • 但是这样太麻烦了, 于是有些人把一些常用的软件提前编译好, 做成软件包(可以理解成windows上的安装程序)放在一个服务器上, 通过包管理器可以很方便的获取到这个编译好的软件包, 直接进行安装.
  • 软件包和软件包管理器, 就好比 “App” 和 “应用商店” 这样的关系

在这里插入图片描述

1.2 如何下载软件:

  • yum list:
    显示所有已经安装和可以安装的程序包。
    这些列表里面的包的来源就是/etc/yum.repo.d

  • 我们推荐先下载一下两个软件:
    lrzsz:

软件功能:支持Windows的文件传到Linux_上,直接拖拽到X-Shell。

yum list | grep lrzsz
yum install -y lrzsz.x86_64

注意:我们下载软件要用root身份,或者通过sudo来提升权限。

  • yum remove :
sudo yum remove lrzsz

1.3 配置国内yum源:

如何知道去哪台服务器上下载软件呢?

  • 因为手机应用市场内置了下载的链接。
  • Linux则是去 /etc/yum.repos.d去找对应链接。
    有的时候在下载的时候会发现,下载的速度非常慢,这是因为有的yum源不是在国内,而是在国外的。这时候就需要我们配制国内的yum源了。

注意:做任何配置,绝对不要先删除,一定是先备份(就是将之前的目录改个名字)。

2. vim编辑器

  • vim是什么?

是一个编辑器
类似于Windows下的记事本 只有写代码的功能,并不能像vs 2019那样的集成开发环境
只能用来写代码,功能强大**(多模式的编辑器)**。

  • 我们为什么要学习vim?

有时候,需要我们在生产环境下,需要你快速的定位问题,甚至需要你快速的修改代码!
vim更适合处理大型项目或者文件。

2.1 vim的安装

一般Liunx都是自带vim,有的则不是自带的,如果没有自带,需要安装一下。

yum install -y vim

2.2 vim的三种模式

vim有很多种模式,我们现在学习三种模式: 底行模式,命令模式,插入模式。
在这里插入图片描述
使用 vim test.c后,默认进入的是“正常模式”

  • 在命令模式下的一些文本批量化操作

yy: 复制当前行,nyy复制n行
p: 粘贴再当前行的后面,np粘贴n次剪贴板的内容
dd: 剪切(删除)当前行,ndd操作n行
u:撤销
ctrl + r: 重做
shift + g: 光标快速定位到文本末尾
gg: 光标快速移动到文本头
n + shift + g: 光标定位到文本的第n行
shift + 4: 光标定位到该行末尾
shift + 6: 光标定位到该行开头
w,b: 以单词为单位进行移动光标
h,j,k,l: 左、下、上、右
shift + `: 大小写快速切换
r: 替换光标所在处的字符,支持nr
shift + r: 批量化替换
x: 删除光标所在处的字符,nx删除n个

其他模式切换至命令模式,直接无脑Esc。
在这里插入图片描述

  • 在底行模式的一些操作如下:

:w 只保存
:q 不保存退出
:wq 保存并退出
:reg 打开vim的寄存器面板
:syntax on 开启语法高亮
:set nu 显示行号
:set nonu 取消行号显示
:set tabstop=4 设置tab的缩进,默认为8
:set softtabstop=4 softtabstop是“逢8空格进1制表符”,前提是你tabstop=8
:set shiftwidth=4设置程序自动缩进所使用的空格长度
:set autoindent 自动对齐上一行(这个选项会导致复制的时候代码排版混乱,可以考虑关闭,或者开启粘贴模式)
:set paste 开启粘贴模式
:set mouse=a 设置鼠标模式,默认是a
/+ 要搜索的内容 指定搜索

VIM配置文件的位置:

  • Vim的配置主要是在.vimrc的文件里面
  • 在目录 /etc/ 下面,有个名为vimrc的文件,这是系统中公共的vim配置文件,对所有用户都有效。
  • 而在每个用户的主目录下,都可以自己建立私有的配置文件,命名为:“.vimrc”。例如,/root目录下,通常已经存在一个.vimrc文件,如果不存在,则创建之。切换用户成为自己执行 su ,进入自己的主工作目录,执行 cd ~
    打开自己目录下的.vimrc文件,执行 vim .vimrc

3. gcc / g++ 编译器

3. 1 编译的处理阶段

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

Gcc是如何完成的。
格式: gcc [选项] 要编译的文件 [选项] [目标文件】

动静态库:查看一个程序的链接关系,可以使用ldd或file
在这里插入图片描述
在这里插入图片描述
系统默认的搜索路径“/usr/lib”下进行查找,也就是链接到libc.so,6 库函数中去。。
动态链接:必须使用动态库(.so)。
静态链接:必须使用静态库(.a)

3. 2 使用gcc生成静态库及静态库的使用方法:

  • 静态库的制作方法:
    代码示例:
  ar -rc libhello.a mymath.o myprint.o
  

%ar 是gnu归档工具,rc表示(replace and create)
静态库的命名:以lib开头+名字+.a结束。
在这里插入图片描述

  • 动态库的制作

动态库生成:

gcc -fPIC -c mymath.c -o mymath_d.o

打包动态库:

gcc -shared myprint.o mymath.o -o libhello.so
  • -shared:表示生成共享库格式
  • -fPIC:产生位置无关代码(position independent code)
    在这里插入图片描述

3. 3 gcc的编译选项:

我们使用gcc编译程序时,常常会用到“-I(大写i), ” -L(大写l)" ,
" -i(小写i)"等参数,下面做个记录在这里插入图片描述

  • -L选项后带的是库的路径。
  • -I选择后带的是头文件的搜索路径。
  • -l选项带的是库的名字,库名要去掉前面的lib和后缀.a。

补充:

  • g++是用来编译C++程序的,用法和gcc一样
  • 因为C++是兼容C语言的,所以g++也能用来编译C语言
  • 如果部分C语言用法gcc不支持的话,那就在gcc编译的最后加上一句-std=c99
  • 例如在循环里定义变量是c99才支持的
    在这里插入图片描述

Gcc选项:

  • -E 只激活预处理,这个不生成文件,你需要把它重定向到一个输出文件里面
  • -S 编译到汇编语言不进行汇编和链接
  • -c 编译到目标代码
  • -o 文件输出到 文件
  • -static 此选项对生成的文件采用静态链接
  • -g 生成调试信息。GNU 调试器可利用该信息。
  • -shared 此选项将尽量使用动态库,所以生成文件比较小,但是需要系统由动态库.
  • -O0
    -O1
    -O2
    -O3 编译器的优化选项的4个级别,-O0表示没有优化,-O1为缺省值,-O3优化级别最高
  • -w 不生成任何警告信息。
  • -Wall 生成所有警告信息

4. gdb 编译器

4.1 背景介绍

用gdb调试的时候非常麻烦比vs麻烦得多,但是在一些特定的场景下就是需要用gdb调试。

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

4.2 gdb的操作指令

如何进入gdb?

使用gdb +可执行程序名字
quit: 代表退出gdb
gdb会记录上一次的命令代码

gdb的操作:

  • b 行号: 打断点
  • info b: 查看断点
  • d 断点编号: 取消断点
  • l 行号: 显示代码
  • l main:显示包含main的那一行
  • r: run,开始运行程序,跳到第一个断点
  • s: step,逐语句,对应vs的F11(进入函数)
  • n: next,逐过程,对应vs的F10
  • c:continue,跳转道下一个断点
  • p: 查看变量
  • display 变量名:跟踪查看一个变量,每次停下来都显示它的值
  • undisplay: 取消对先前设置的那些变量的跟踪
  • until 行号:跳转到指定行
  • finish: 执行完一个函数后停下
  • bt: 查看函数调用堆栈

gdb知道、会用就可以了。。

5. make / Makefile

经过上述的学习之后,我们知道Linux下要是生成一个可执行(exe)文件是很麻烦的,当多个源文件一起编译的时候,一个一个生成目标文件最后再链接,很麻烦

项目结构:
1.多文件.h /.c /.cpp 先编译哪一个程序?
2.链接需要哪些库?
3.库和头文件等在哪里找?

我们在vs中生成可执行文件只需要一键点击,清理解决方案也是一键点击,非常方便。

但在Linux系统上,就需要自己去构建项目的工程结构?

  • make :是一个指令
  • Makefile:是一个文件

make 和Makefile类似于:Vs当中生成解决方案

5.1 makefile的介绍

我们在makefile文件中通过,依赖关系和依赖方法,达到我们最终的目的,生成可执行文件。

  • 依赖关系:表明我要将那些文件生成
  • 依赖方法:表明我如何生成该文件

makefile表明的是依赖关系和依赖方法。

对应的Makefile如下:
在这里插入图片描述
注意:

  • make指令默认只会形成第一个目标文件,执行该依赖关系的依赖方法。
  • 要运行第二个依赖方法,则需要make clean
  • .PHONY: 是makefile语法格式中的一个关键字
  • clean被.PHONY修饰,表明:总是被执行!

什么叫总是被执行:

  • 无论目标文件是否新旧,照样直接执行依赖关系!
  • 像普通的文件,make之后,就不会重复生成可执行程序,这就叫总不被执行。

5.2 如何判断是否重新生成:

那么问题来了,makefile是如何识别我的exe/bin是新的还是旧的呢?

答案就是:根据对比源文件和可执行程序的最近修改时间,评估要不要重新生成

一般而言,Linux下的文件会有三种时间:
在这里插入图片描述

  • Access: 访问时间对于文件来说,当我们使用cat、more、less等命令读取文件内容时。
  • Modity: 对文件内容修改时,Modify、Change时间会更新。
  • Chang: 对文件属性修改时,例如chmod、chown、chcgrp等操作后,Change 时间会更新

5.3 多文件的makefile

1.依赖多个.c文件生成一个可执行程序

mytest:main.o test.o
  gcc -o mytest main.o test.o
main.o:main.c
  gcc -c main.c -o main.o
test.o :test.c
  gcc -c test.c -o test.o
 
 .PHONY:clean
 clean:
    rm -r *.o mytest

2.生成多个可执行程序(exe)

 .PHONY:all
all: exec mycmd

mycmd:mycmd.c
   gcc -o $@ $^
exec:exec.c
   gcc -o $@ $^

 .PHONY:clean
 clean:
    rm -r *.o exec mycmd

6. Linux第一个程序 —— 进度条

6.1 回车和换行的概念:

平时接触的的换行一般指的是回车 + 换行,就是另起一行。但是实际上回车和换行还是有区别的:
回车是回车,换行是换行~

  • 回车: 光标回到该行的最前面
  • 换行: 光标去到下一行,但是列不变

在我们之前学习的C语言中,\n就是回车 + 换行,而 \r 是回车。

6.2 缓存区的概念:

  • 当我们printf一个字符串的时候,系统是先把这个字符串写入缓冲区,再把缓冲区的内容输出到屏幕上。
  • 在linux环境中,\n会自动刷新缓冲区(只要缓冲区被刷新了就会在屏幕上显示出来)。
  • 如果缓冲区没有刷新我们可以手动刷新,就需要用到**fflush() **函数来刷新一下。
    在这里插入图片描述
#include <stdio.h>
#include <unistd.h>
#include <string.h>

#define CNT 101
#define STYLE '#'

void process()
{
    char arr[CNT];
    memset(arr, '\0', sizeof(arr));

    const char* str = "/-|\\";
    int i = 0;

    for(i = 0; i < 100; i++)
    {
        arr[i] = STYLE;
        printf("\033[46;34m[%-100s]\033[0m [%d%%] %c\r", arr, i + 1, str[i % 4]);
        fflush(stdout);
        usleep(40000);
    }

    
    printf("\n");
}

int main()
{
    process();

    return 0;
}

尾声
看到这里,相信大家对这个C++有了解了。
如果你感觉这篇博客对你有帮助,不要忘了一键三连哦

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

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

相关文章

创建comfyui自定义节点

参考 https://github.com/liubai-liubai/ComfyUI-ImgSeg-LB/tree/main https://blog.styxhelix.life/?p33 安装 不需要安装任何其他依赖文件&#xff0c;只需要把0x_erthor_node文件夹复制到custom_nodes文件夹下&#xff0c;就能安装成功。 a1&#xff1a;展示了代码结构&…

数字化转型,不做是等死,做了是找死

“ 有不少人调侃说&#xff1a;数字化转型&#xff0c;不做是等死&#xff0c;做了是找死。如果你是一个老板&#xff0c;你会怎么选择呢&#xff0c;下面我来剖析一下。” 我按照“做正确的事&#xff0c;正确的做事”来分析数字化转型&#xff0c;再通过抓痛点和流程再造两项…

guli商城业务逻辑-基础篇笔记

这里写目录标题 0.1 viscode设置用户代码片段1.实现多级菜单接口1.1 对接前端菜单1.2 对接网关接口解决跨域问题&#xff0c;如果不解决跨域&#xff0c;浏览器还是访问不了api1.3 把商品服务添加网关1.4 修改前端显示分类菜单1.5 给菜单添加删除修改功能1.5.1 删除功能的后端业…

【猫狗分类】Pytorch VGG16 实现猫狗分类5-预测新图片

背景 好了&#xff0c;现在开尝试预测新的图片&#xff0c;并且让vgg16模型判断是狗还是猫吧。 声明&#xff1a;整个数据和代码来自于b站&#xff0c;链接&#xff1a;使用pytorch框架手把手教你利用VGG16网络编写猫狗分类程序_哔哩哔哩_bilibili 预测 1、导包 from to…

分数布朗运动FBM期权定价模型

BS定价模型和蒙特卡洛模拟期权定价方法都 假设标的资产价格的对数服从布朗运动 &#xff0e; 但是实际 的金融市场中标的资产价格运动过程具有 “尖峰厚尾 ” 现象 &#xff0c; 运用分数布朗运动 &#xff08;FBM &#xff09;来刻画标的资产 价格的运动过程可能更加合适。 …

HP惠普暗影精灵10 OMEN Gaming Laptop 16-wf1xxx原厂Win11系统镜像下载

惠普hp暗影精灵10笔记本电脑16-wf1000TX原装出厂Windows11&#xff0c;恢复开箱状态oem预装系统安装包&#xff0c;带恢复重置还原 适用型号:16-wf1xxx 16-wf1000TX,16-wf1023TX,16-wf1024TX,16-wf1025TX, 16-wf1026TX,16-wf1027TX,16-wf1028TX,16-wf1029TX, 16-wf1030TX,16-…

docker拉取镜像太慢解决方案

前言 这是我在这个网站整理的笔记,有错误的地方请指出&#xff0c;关注我&#xff0c;接下来还会持续更新。 作者&#xff1a;神的孩子都在歌唱 创建daemon.json文件,输入以下信息 vim /etc/docker/daemon.json{"registry-mirrors": ["https://9cpn8tt6.mirror…

JAVA开发 选择多个文件,系统运行后自动生成ZIP压缩包

选择多个文件&#xff0c;系统运行后自动生成ZIP压缩包 实现方法1.1 代码块1.2 运行结果截取 相关知识 实现方法 案例简述&#xff1a;通过启动java代码来打开文件选择器对话框&#xff0c;用户选择确认需要进行压缩的文件&#xff0c;可一次性选择多个文件&#xff0c;选择完…

边缘计算采集网关解决方案:为企业提供高效、灵活的数据处理方案-天拓四方

一、企业背景 某大型制造企业&#xff0c;位于国内某经济发达的工业园区内&#xff0c;拥有多个生产线和智能化设备&#xff0c;致力于提高生产效率、降低运营成本。随着企业规模的扩大和生产自动化的推进&#xff0c;该企业面临着海量数据处理、实时响应和网络安全等多重挑战…

安卓在Fragment控制状态栏显示隐藏

废话不多上效果 隐藏 显示 核心代码 首先是Framgrent package com.zx.tab;import android.content.Context; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.Button;impor…

Django中间件探索:揭秘中间件在Web应用中的守护角色与实战应用

系列文章目录 Django入门全攻略&#xff1a;从零搭建你的第一个Web项目Django ORM入门指南&#xff1a;从概念到实践&#xff0c;掌握模型创建、迁移与视图操作Django ORM实战&#xff1a;模型字段与元选项配置&#xff0c;以及链式过滤与QF查询详解Django ORM深度游&#xff…

Cisco Packet Tracer实验(四)

生成树协议&#xff08;Spanning Tree Protocol&#xff09; 交换机在目的地址未知或接收到广播帧时是要进行广播的。如果交换机之间存在回路/环路&#xff0c;那么就会产生广播循环风暴&#xff0c;从而严重影响网络性能。 而交换机中运行的STP协议能避免交换机之间发生广播…

登录MySQL方式

登录MySQL方式 方式一&#xff1a;通过MySQL自带的客户端 MySQL 客户端输入命令即可 方式二&#xff1a;通过window自带的客户端 从命令端&#xff08;cmd&#xff09;进入 mysql -h localhost -P 3306 -u root -p Enter password:密码登录方式&#xff1a; mysql -h 主…

【Java03】Java中数组在内存中的机制

1. 内存中的数组 Java中的数组是一种引用类型&#xff0c;数组变量&#xff08;引用&#xff09;和数组元素在内存中是分开的。 Java中的数组变量其实就是指针。 如果想要访问数组元素&#xff0c;只能通过这个数组的引用变量&#xff08;指针&#xff09;来访问。 实际数组对…

上海计算机考研避雷,25考研慎报

上大计算机一直很热 408考研er重来没有让我失望过&#xff0c;现在上大的专业课是11408&#xff0c;按理说&#xff0c;这个专业课的难度是很高的&#xff0c;但是408er给卷出了新高度&#xff0c;大家可以去上大官网看看今年最新的数据&#xff0c;我也帮大家统计了24年最新的…

【YOLOv10轻量级涨点改进:block优化 | 华为诺亚2023极简的神经网络模型 VanillaNet】

本文属于原创独家改进:一种极简的神经网络模型VanillaNet,以极简主义的设计为理念,网络中仅仅包含最简单的卷积计算,去掉了残差和注意力模块 计算量参数量比较,8.4 GFLOPs降低至6.1 GFLOPs YOLOv10n summary: 385 layers, 2709380 parameters, 2709364 gradients, 8.4 GF…

分享一个 .NET Core 使用选项方式读取配置内容的详细例子

前言 在 .NET Core 中&#xff0c;可以使用选项模式&#xff08;Options Pattern&#xff09;来读取和管理应用程序的配置内容。 选项模式通过创建一个 POCO&#xff08;Plain Old CLR Object&#xff09;来表示配置选项&#xff0c;并将其注册到依赖注入容器中&#xff0c;方…

图像处理:Python使用OpenCV进行图像锐化 (非锐化掩模、拉普拉斯滤波器)

文章目录 非锐化掩模 (Unsharp Masking)拉普拉斯滤波器 (Laplacian Filter)效果对比总结 在图像处理中&#xff0c;锐化操作用于增强图像的边缘和细节&#xff0c;使图像看起来更清晰。常见的图像锐化方法包括非锐化掩模&#xff08;Unsharp Masking&#xff09;和拉普拉斯滤波…

Linux:基础IO(二.缓冲区、模拟一下缓冲区、详细讲解文件系统)

上次介绍了&#xff1a;Linux&#xff1a;基础IO&#xff08;一.C语言文件接口与系统调用、默认打开的文件流、详解文件描述符与dup2系统调用&#xff09; 文章目录 1.缓冲区1.1概念1.2作用与意义 2.语言级别的缓冲区2.1刷新策略2.2具体在哪里2.3支持格式化 3.自己来模拟一下缓…

Burp Suite Professional 2024.5 (macOS, Linux, Windows) - Web 应用安全、测试和扫描

Burp Suite Professional 2024.5 (macOS, Linux, Windows) - Web 应用安全、测试和扫描 Burp Suite Professional, Test, find, and exploit vulnerabilities. 请访问原文链接&#xff1a;Burp Suite Professional 2024.5 (macOS, Linux, Windows) - Web 应用安全、测试和扫描…