Linux第一章 环境搭建

news/2025/2/22 4:49:58

文章目录

  • 环境搭建
    • 安装wsl
    • 安装GUI可视化界面
  • 常用命令
    • 基础常识
      • 命令解析器
      • 查看shell操作
      • 系统结构
      • 目录结构
        • 主要目录介绍
      • 路径结构
        • 绝对路径
        • 相对路径
      • 命令提示符
      • 文件属性
    • 包管理命令
      • ==sudo apt-get==
    • 文件和目录操作
      • ==tree==
      • ==ls==
      • ==cd==
      • ==pwd==
      • ==which==
      • ==touch==
      • ==mkdir==
      • ==rmdir==
      • ==rm==
      • ==cp==
      • ==mv==
      • ==cat==
      • ==more==
      • ==stat==
      • ==ln==
      • ==wc==
      • ==whoami==
    • 用户权限操作
      • ==chmod==
      • ==chown==
      • ==chgrp==
    • 检索查找操作
      • ==find==
      • ==grep==
    • 管道命令
      • 管道符
    • 帮助命令
  • 常用工具
    • vim编辑器
    • gcc/g++编译器
      • 库操作
        • 什么是库?
        • 静态库
          • 简介
          • 制作
          • 使用
          • 优劣
        • 动态库
          • 简介
          • 制作
          • 使用
          • 优点
          • 缺点
    • makefile
    • makefile
      • make
      • Makefile
        • 简单写一个hello.c,用makefile构建
    • gdb调试器
      • 常用命令
    • 压缩与解压
      • 屌丝版
        • gzip
          • 压缩
          • 解压
        • bzip
      • 高富帅
        • tar
          • 压缩
          • 解压缩
        • rar
          • 压缩
          • 解压缩
        • zip
          • 压缩
          • 解压缩

环境搭建

安装wsl

  1. 打开开始菜单,搜索启用或关闭windows功能
    点开来
    在这里插入图片描述
    确定之后重启电脑
  2. 以管理员打开powershell ,输入下图命令
    在这里插入图片描述
  3. 更新好后,输入并运行命令wsl --shutdown
  4. 输入运行命令wsl --set-default-version 2
  5. 打开windows商店,搜索ubuntu,找到最新版的下载安装
    在这里插入图片描述
  6. 安装好后打开来,给root用户设置一个密码
    在这里插入图片描述
  7. 测试一下能否登陆root
    在这里插入图片描述

安装GUI可视化界面

视频教程点链接

以管理员身份打开终端:

dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart

dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart

在Ubuntu中输入:
lsb_release -a

sudo apt update && sudo apt -y upgrade
sudo apt install xrdp
sudo apt install -y xfce4
apt install calc

calc

exit

sudo apt install -y xfce4-goodies
sudo vi /etc/xrdp/startwm.sh
进入vi文件后,注释掉最后2行
再添加一行startxfce4保存退出

service xrdp status

sudo /etc/init.d/xrdp start

ip a

sudo apt-get install xfce4-terminal
在这里插入图片描述

常用命令

基础常识

命令解析器

Linux命令解析器,通常被称为shell,是Linux操作系统中的一个关键组件。它充当用户和系统内核之间的接口,允许用户通过输入命令来控制和管理操作系统和应用程序,用户通过shell输入命令,shell解释这些命令,并将其转换为内核能理解的指令。常用的命令解析器主要有以下几种:

  • Bash:是Linux上最常用的命令解析器,它是Bourne-Again Shell的缩写。支持命令行历史纪录、自动补全、别名、管道等。
  • Bourne Shell:是Linux默认的shell,它是最早的一种shell,也是最基础的一种。在Linux中,我们输入用户名和密码登陆之后,就开始执行一个shell解释器程序,通常是/bin/bash,当然也可以是别的,比如/bin/sh。
  • C Shell(csh): 是另一种常用的Unix shell,它是由Bill Joy在Bourne Shell的基础上开发的,提供了一些Bourne Shell没有的特性,如命令补全、历史命令、作业控制等。
  • Korn Shell(ksh):是在Bourne Shell的基础上发展起来的,它的设计目标是提供Bounrne Shell的所有功能,并增加一些新的特性,如命令补全、历史命令、作业控制等。它是一种非常流行的Unix Shell,广泛应用于各种Unix系统中。
  • Tcsh:是在Korn Shell的基础上发展起来的,它的设计目标是提供Bourne Shell和ksh的所有功能,并增加一些新的特性,如命令补全、历史命令、作业控制等。它是一种非常流行的Unix Shell,广泛应用于各种Unix系统中。
  • Windows PowerShell:是微软的.NET FrameWork 技术的Windows NT系统中的一种命令解析器。它提供了强大的命令行操作功能,支持.NET FrameWork技术,可以方便地进行脚本编程

查看shell操作

当前系统使用的shell

$ echo $SHELL

当前系统所有shell

cat /etc/shells

在这里插入图片描述

系统结构

在这里插入图片描述

上图就是操作系统的“圈层模型”,其中最内层是最底层的系统组件,负责直接与硬件交互,而向外层逐渐过渡到用户空间和应用程序。这种模型有助于保护系统的安全,因为它限制了对核心组件的直接访问。只有经过适当的权限和系统调用,外层的应用程序和用户才能与内核层的组件交互。

  • 内核:位于最中心的是Linux系统的核心。内核是操作系统的心脏,负责管理硬件资源,以及进程、内存、文件系统的控制等。
  • shell层:离内核更远一些的是shell层。这个层次代表了系统中的命令解析器,也就是前面解释过的shell,它为用户提供了一个与系统交互的界面。
  • 应用层:最外层是应用层,代表运行在用户空间的各种应用程序。这些程序通过系统调用与内核进行交互,并通过shell与用户进行交互
  • 用户:在最外层,表示操作系统的用户,他们通过应用程序和shell与系统互动。

目录结构

Linux系统的目录结构是一个倒立的树状结构,根目录用/表示,对比windows目录结构理解linux的目录结构。
在这里插入图片描述

主要目录介绍

/bin
binary,二进制文件,可执行程序,shell命令
如:ls,rm,mv,cp等常用命令

/sbin
s是Super User的意思,这里存放的是系统管理员使用的系统管理程序。
如:ifconfig,halt,shutdown,reboot等系统命令

/dev
device,在linux下一切皆文件:

  • 硬盘,显卡,显示器
  • 字符设备文件、块设备文件
  • 如:sudo cat mouse0

/lib
linux运行的时候需要加载的一些动态库
如: libc.so、libpthread.so等

/mnt
手动的挂载目录,如u盘等

/media
外设的自动挂载目录,如光驱等

/root
liunx的超级用户root的家目录

/usr
unix system resource–类似于WINDOWS的programe files目录

  • include目录里存放头文件, 如: stdio.h、stdlib.h、string.h、pthread.h
  • games目录下的小游戏-如: sl小火车游戏

/etc
存放配置文件

  • /etc/passwd
    • man 5 passwd可以查看passwd文件的格式信息
  • /etc/group
    • man 5 group可以查看group文件的格式信息
  • /etc/profile
    • 系统的配置文件, 修改该文件会影响这个系统下面的所有的用户

/opt
安装第三方应用程序
比如安装oracle数据库可以在这个目录下

/home
linux操作系统所有用户的家目录

  • 用户家目录:(宿主目录或者主目录)
    • /home/itcast

/tmp

  • /tmp: 存放临时文件
    • 新建在这个目录下的文件会在系统重启后自动清除

路径结构

绝对路径

从根目录开始表示的路径,也就是从/开始,例如:/home/itcast

相对路径
  • 从当前所处的目录开始表示的路径。

  • .表示当前目录

  • . . 表示当前目录的上一级目录

命令提示符

在这里插入图片描述

  • yerennuo:当前登陆的用户
  • @:在的意思
  • YERENNUO:主机名
  • ~:当前工作目录,~表示宿主目录
  • $:表示当前用户为普通用户,#表示当前用户为root用户

文件属性

在这里插入图片描述

  • 第1个字符:文件类型

    • - : 普通文件
    • d : 目录
    • l : 符号链接,相当于windows中的快捷方式
    • s : 套接字
    • p : 管道
    • b : 块设备
    • c : 字符设备
  • 第2-10个字符

    • 文件所有者对文件的操作权限 (2,3,4个字符):rwx

    • 文件所属组用户对文件的操作权限(5,6,7个字符):rwx

    • 其他人对文件的操作权限(8,9,10个字符):r-x

    • 权限属性

      • r:是可读权限(read)
      • w:是可写权限(write)
      • x:是可执行权限(execute)
      • -:没有权限
  • 硬链接计数:1

    • 对于目录来说, 链接计数等于该目录下所有的目录总数(含. 和 …), 但是不包含该目录的子目录下的目录文件数量
    • 对于文件来说, 指的是该文件所有的硬链接文件数量
  • 文件所有者:yerennuo

  • 文件所属组:yerennuo

  • 文件大小: 512 Byte

    • 如果是目录: 只表示目录大小, 不包含目录中的内容, 目录大小为4k
    • 如果是文件:表示文件大小
  • 文件的创建日期或最后修改时间:10月 9日 09:40

  • 文件名:Lyric

包管理命令

sudo apt-get

命令简述:apt-get命令是一个功能强大且免费的包管理命令行程序,用于与Ubuntu的APT(高级打包工具)库配合执行新软件包的安装、删除现有软件包、升级现有软件包、甚至用于升级整个操作系统

#更新本地软件包列表
sudo apt-get update
#从软件仓库中检索并拉取我们想要的软件
sudo apt-get install name

安装man手册

sudo apt update
sudo apt install manpages manpages-dev

也可以安装中文版的man,请自行安装
安装查找包

apt install net-tools

安装编译器

apt install gcc g++

安装远程工具

apt install openssh-server

文件和目录操作

tree

命令简述:以树状形式查看指定目录内容,使用该命令需要安装软件tree
在这里插入图片描述
在这里插入图片描述

ls

在这里插入图片描述

命令简述:查看指定目录下的文件信息

常用选项

  • -a : 列出当前目录下的所有文件

  • -R:递归方式列出所有目录中的内容

  • -r:倒序输出所有文件

  • -l:列出文件的详细信息

  • -h:以人类能读懂的方式显示(主要是文件大小可以显示单位)

  • 参数之间可以结合使用:

    • ls -la : 列出当前目录下所有文件的相信信息, 包括隐藏文件
    • ls -ltr: 列出当前目录下的文件, 按照时间逆向排序
      在这里插入图片描述

cd

命令简述:切换目录
常用操作

  • 切换到家目录(例如: /home/moying)

    • cd /
    • cd ~
    • cd /home/yerennuo
    • cd $HOME
  • 临近两个目录直接切换:cd -

pwd

命令简述:查看用户当前所处的工作目录
在这里插入图片描述

which

命令简述:显示命令所在的目录
在这里插入图片描述

touch

命令简述:如果文件不存在, 创建新文件, 如果文件存在, 更新文件的最后修改时间
在这里插入图片描述

mkdir

命令简述:如果文件不存在, 创建新文件, 如果文件存在, 更新文件的最后修改时间
在这里插入图片描述
创建多级目录
在这里插入图片描述

rmdir

命令简述:删除空目录
在这里插入图片描述

rm

命令简述:删除文件或目录
常用选项

  • -r:递归删除目录,删除目录必须添加此参数

  • -i:提示用户是否删除文件或目录(删除时最好指定,以免误触,有反悔的机会)

  • -f:强制删除
    在这里插入图片描述
    注意事项:

使用rm命令删除的文件或目录不会放入回收站中,数据不易恢复。

结合通配符可删除满足条件的文件。

  • rm *.c 删除后缀名为.c的文件
  • rm * 删除所有(非目录)文件
  • rm -rf * 强制删除所有文件慎用
  • rm -rfi /* 不要执行此命令,此命令会将根目录/下所有文件都删除,系统就崩溃了。

cp

命令简述:拷贝文件或目录
在这里插入图片描述

mv

命令简述:改名或者移动文件
在这里插入图片描述

cat

命令简述:将文件内容一次性输出到终端
在这里插入图片描述
这里我先用vim进入文件添加了一串数字

常用选项

  • -n,–number:从1开始对所有输出的行编号(输出行号)
  • -b 或 --number-nonblank:和 -n 相似,对空白行不编号。
  • -s 或 --squeeze-blank:当遇到有连续两行以上的空白行,就代换为一行的空白行。
  • -E 或 --show-ends : 在每行结束处显示 $。
  • -T 或 --show-tabs: 将 TAB 字符显示为 ^I。

注意事项

缺点:终端显示的内容有限,如果文件太长无法全部显示。可用于文件重定向: cat file1>file2, 相当于cp file1 file2

more

命令简述:文件内容分页显示到终端,但是只能一直向下浏览,不能回退

stat

命令简述:显示文件的状态信息,比ls命令输出更详细
在这里插入图片描述

ln

命令简述:创建链接
在这里插入图片描述
使用这个创建的链接
在这里插入图片描述

wc

命令简述:打印文件的行数、 单词、数字节数,可以指定选项仅获取某个信息
常用选项

  • -l :显示文件的总行数
  • -c:显示文件的总字节数
  • -w:显示文件的总单词数
    在这里插入图片描述

whoami

命令简述:显示当前登陆的用户名
在这里插入图片描述

用户权限操作

chmod

命令简述:修改文件相关的权限

chown

命令简述:修改文件所有者和所属组

chgrp

命令简述:修改文件所属组

检索查找操作

find

命令简述:文件查询指令

#查找指令路径省略表示查找当前目录
#	1.指定路径下查找文件
#	*.c: 以.c结尾的文件
#	t*.c: 以t开头 .c结尾的所有文件
find  路径 -name  "文件名"
#	2.指定路径下查找指定类型文件
# f:普通文件
# d:目录
# l:符号链接
# b:块设备文件
# c:字符设备文件
# s:socket文件
# p:管道文件
find 路径 -type f
#	3.按文件大小查找文件
#范围
  #大于:+表示 +100k
  #小于:-表示 -100k
  #等于: 无符号 100k
#大小
  #M 必须大写(10M)
  #k 必须小写(20k)
  #c 表示字节数
find  路径  -size  范围
#	4.按照日期查找文件
  #-: n天以内
  #+: n天以外
#	创建日期
find -ctime [-|+]n
#	修改日期
find -mtime[-|+] n
# 	访问日期
find -atime[-|+] n
#	5.按深度查找
#搜索n层以下的目录, 搜索的层数不超过n层
find -maxdepth n
#搜搜n层以上的目录,搜索的层数不能小于n层
find -mindepth n 

在这里插入图片描述

grep

命令简述:文本搜索工具,根据用户指定的“模式(过滤条件)”对目标文本逐行进行匹配检查,打印匹配到的行

grep [options] [pattern] file
#命令   选项       模式      文件

常用选项

  • -i:ignorecase 忽略大小写;
  • -o:仅显示匹配到的字符串本身;
  • -v:显示不能被模式匹配到的行;
  • -E:支持使用拓展的正则表达式元字符;
  • -q:静默模式,即不输出任何信息;
  • -n:显示匹配行与行号;
  • -w:只匹配过滤的单词
  • -c:只打印每个文件选定行的计数

管道命令

管道符

管道符|,管道是一种通信机制,通常用于进程间的通信。它表现出来的形式将前面每一个进程的输出(stdout)直接作为下一个进程的输入(stdin)

在这里插入图片描述

在每个管道后面接的第一个数据必定是命令,而且这个命令必须要是能够接受标准输入的数据才行,这样的命令才可为管道命令。
在这里插入图片描述

管道命令主要有两个比较需要注意的地方:

  • 管道命令仅会处理标准输出,对于标准错误输出会予以忽略
  • 管道命令必须要能够接受来自前一个命令的数据成为标准输入继续处理才行

xargs

命令简述:捕获一个命令的输出,然后传递给另外一个命令
在这里插入图片描述

帮助命令

man

命令简述:用于查看各种命令、函数和配置文件的手册页面

man [选项] [节号] 命令/主题
#一些常见的选项包括:
#-f:显示与指定关键字相关的手册页面。
#-k:搜索手册页中与关键字匹配的条目。
#-a:显示所有匹配的手册页面。
#-w:仅显示手册页的位置,而不显示其内容。
#常见的节号包括:
#1:用户命令
#2:系统调用
#3:C库函数
#4:设备和特殊文件
#5:文件格式和约定
#6:游戏和演示
#7:杂项
#8:系统管理命令

在这里插入图片描述

常用工具

vim编辑器

跟之前vscode的vim介绍的差不多
在这里插入图片描述

gcc/g++编译器

编译流程

gcc编译器将c源文件到生成一个可执行程序,中间一共经历了四个步骤:

在这里插入图片描述

四个步骤并不是gcc独立完成的,而是在内部调用了其他工具,从而完成了整个工作流程, 其中编译最耗时, 因为要逐行检查语法.

在这里插入图片描述
四个步骤,对应的gcc命令为(以test.c为例)

  • gcc -E test.c -o test.i
  • gcc -S test.i -o test.s
  • gcc -c test.s -o test.o
  • gcc test.o -o test

当然也可以一步到位(四合一)

  • gcc test.c -o test
    在这里插入图片描述
    常用选项

  • -v,–version 查看gcc版本

  • -E 进行预处理;不要编译、汇编或链接。

  • -S 进行编译,不汇编或链接。

  • -c 编译和汇编,但不要链接。

  • -o <file> 指定输出文件名

  • -I 指定头文件路径

  • -l 指定库名

  • -L 指定库文件所在路径

  • -g 生成的目标包含调试信息,使用gdb调试必须添加-g参数

  • -O<n> n=0~3 编译优化,n越大优化越多

  • -Wall 提示更多警告

  • -D 编译时定义宏

  • -std=c++<17> g++专用,用来指定c++标准

库操作

什么是库?

库是二进制文件,是源代码文件的另一种表现形式。

为什么要使用库呢?使用库可以加密源代码或者方便使用发布

库制作完毕后,只需要头文件和库文件,别人就可以方便使用了(库不能单独使用, 只能作为其他执行程序的一部分完成某些功能, 也就是说只能被其他程序调用才能使用)

库有两种:静态库(.a、.lib)和动态库(.so、.dll)。所谓静态、动态是指链接方式。
在这里插入图片描述

静态库
简介

在链接阶段,将汇编生成的目标文件.o与引用的库一起打包到可执行文件中,此种链接方式称为静态链接。按照习惯,一般以.a作为文件后缀(windows一般是.lib)。

静态库命名一般分为三个部分:

  • 前缀:lib表示是库
  • 库名:由制作者指定名称,如test
  • 后缀:.a

所以最终的静态库名应该为:libtest.a

制作

我们来制作一个实现整数加法的库,库就只提供一个add函数。

  • 首先,将.c源文件编译成目标.o文件
  • 然后,通过ar工具将准备好的.o文件打包为.a文件
    在这里插入图片描述
    在这里插入图片描述
使用

gcc -o test_add main.c -L./bin -ladd -I./include
在这里插入图片描述

静态库制作完成之后,需要将.a文件和头文件一起发布给用户。

假设测试文件为main.c, 静态库文件为libadd.a, 头文件为add.h

gcc用到的参数:

  • -L:指定要连接的库的所在目录

  • -l(小写的L):指定链接时需要的静态库, 去掉前缀和后缀

  • -I: 指定main.c文件用到的头文件add.h所在的路径

优劣

优点

  • 函数库最终被打包到应用程序中,实现是函数本地化,寻址方便、速度快。(库函数调用效率==自定义函数使用效率)

  • 程序在运行时与函数库再无瓜葛,移植方便。

缺点

  • 消耗系统资源较大, 每个进程使用静态库都要复制一份, 无端浪费内存。

  • 静态库会给程序的更新、部署和发布带来麻烦。如果静态库libxxx.a更新了,所有使用它的应用程序都需要重新编译、发布给用户(对于玩家来说,可能是一个很小的改动,却导致整个程序重新下载)。

动态库
简介

动态库在程序编译时并不会被连接到目标代码中,而是在程序运行是才被载入,不同的应用程序如果调用相同的库,那么在内存里只需要有一份该共享库的实例;规避了空间浪费问题。

动态库在程序运行时才被载入, 也解决了静态库对程序的更新、部署和发布会带来麻烦. 用户只需要更新动态库即可, 增量更新。为什么需要动态库, 其实也是静态库的特点导致的。

按照习惯, 一般以”.so”做为文件后缀名(windows一般是.dll)。

共享库的命名一般分为三个部分:

  • 前缀:lib

  • 库名称:自己定义即可, 如test

  • 后缀:.so

所以最终的动态库的名字应该为:libtest.so

制作
  • 首先,生成.o文件,注意,需要加上编译选项-fpic

    gcc ./src/add.c -o ./bin/sum.o -c -FPIC -Iinclude
    
  • 然后,生成共享库,注意,需要加上编译选项-shared

    gcc -shared ./bin/sum.o -o ./bin/libadd.so
    

    Ok,生成动态库成功了!

使用

引用动态库编译成可执行文件(跟静态库方式一样):

gcc用到的参数:

  • -L:指定要连接的库的所在目录

  • -l(小写的L):指定链接时需要的静态库, 去掉前缀和后缀

  • -I: 指定main.c文件用到的头文件add.h所在的路径

在这里插入图片描述
生成的可执行文件运行提示找不到库,有如下方法解决
如何让系统找到共享库

  • 方法1: 拷贝自己制作的共享库到/lib或者/usr/lib

    sudo cp bin/libadd.so /usr/lib
    
  • 方法2: 临时设置LD_LIBRARY_PATH:

    export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:库路径
    //查看环境变量的值传递
    echo $LD_LIBRARY_PATH
    
  • 方法3: 把export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:库路径, 设置到∼/.bashrc文件中。然后在执行下列三种办法之一:

    • 执行. ~/.bashrc使配置文件生效(第一个.后面有一个空格)
    • 执行source ~/.bashrc配置文件生效
    • 退出当前终端,然后再次登陆也可以使配置文件生效
  • 方法4:永久设置,把export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:库路径,设置到/etc/profile文件中

  • 方法5:将其添加到 /etc/ld.so.cache文件中

    • 编辑/etc/ld.so.conf文件, 加入库文件所在目录的路径
    • 运行sudo ldconfig -v, 该命令会重建/etc/ld.so.cache文件

解决了库的路径问题之后, 再次ldd命令可以查看可执行文件依赖的库文件
在这里插入图片描述
优劣

优点
  • 动态库把对一些库函数的链接载入推迟到程序运行的时期,可以让可执行程序的体积更小。

  • 将一些程序升级变得简单,只需要替换共享库即可,可执行程序不需要改变。

  • 甚至可以真正做到链接载入完全由程序员在程序代码中控制(显示调用)

缺点
  • 由于是在程序运行时加载的动态库,加载效率会比静态库低一些

  • 由于动态库和可执行程序是独立,有可能会丢失动态库导致程序不能执行

makefile

makefile

make

make是一个自动化构建工具,广泛应用于C/C++项目中,但也可以用于其他编程语言。它的主要功能是根据Makefile中的规则自动执行一系列命令,从而生成目标文件。make通过比较目标文件和依赖文件的时间戳来决定是否需要重新构建某个目标,从而避免了不必要的编译,提高了构建效率。

我们安装GCC后,应该默认就已经安装了make,没有没有安装,Ubuntu下可通过如下命令来安装:
安装 sudo apt install make
在这里插入图片描述

Makefile

Makefile 是一个文本文件,定义了构建项目的规则和指令。通常定义了多条包含 目标(target)、依赖(dependency)和命令(command) 的规则。

make 与 Makefile的关系

  • Makefile 你可以理解为是自动构建的脚本,里面通过 目标(target)、依赖(dependency)和命令(command) 定义了规则,告诉make工具要如何一步步构建我们的最终目标。
  • make 是一个命令工具,是一个解释并执行Makefile中指令的命令工具,按照Makefile制定的规则,构建最终的目标产物。
    在这里插入图片描述
    语法

基本语法

目标: 依赖
    命令
  • 目标: 通常是需要生成的文件名,也可以是某个操作(如clean)。
  • 依赖: 生成目标文件所依赖的其他文件或其他目标。
  • 命令: 生成目标所需执行的shell命令,必须以Tab键开头。

注意: 命令前面必须是tab键,表示命令的开始。不能用4个空格或者两个空格。

变量

在Makefile中,可以使用变量来简化规则的编写。变量定义如下:

变量名 = 值

使用变量时,需要在变量名前加上$符号,并用括号括起来:

$(变量名)

伪造目标

伪目标是一种特殊的目标,它不代表具体的文件,通常用于执行某些操作。伪目标需要使用.PHONY声明:

.PHONY: clean
clean:
    rm -f hello hello.o

模式规则

模式规则允许定义通用的规则,适用于多个目标。例如:

%.o: %.c
    $(CC) $(CFLAGS) -c $<

这条规则表示所有.o文件都依赖于对应的.c文件,并且使用相同的编译命令

自动变量

make提供了一些自动变量,用于简化命令的编写:

  • $@:表示目标文件名。
  • $<:表示第一个依赖文件名。
  • $^:表示所有依赖文件名。

条件变量

Makefile支持条件判断,可以根据不同的条件执行不同的命令

ifeq($(DEBUG),1)
    CFLAGS += -g    #含调试信息
else
    CFLAGS += -O2    #编译器优化选项
endif
  • ifeq‌:比较两个参数是否相等。
  • ifneq‌:比较两个参数是否不等。
  • ifdef‌:检查变量是否存在且非空。
  • ifndef‌:检查变量是否存在且为空‌

内置函数

  • wildcard: 匹配

  • patsubst:替换

  • abspath:获取绝对路径

简单写一个hello.c,用makefile构建

hello.c里随便写一段c语言程序
在这里插入图片描述
Makefile里这么写
在这里插入图片描述
然后执行make

在这里插入图片描述
就生成完成了
在这里插入图片描述

gdb调试器

安装 sudo apt install gdb

常用命令

  1. g++ 编译附加调试信息命令:g++ 文件名.cpp -o 可执行文件名.exe -g //-g附加调试信息

  2. 启动gdb命令:gdb 可执行文件名.exe -tui //-tui开启图形界面,不加-tui命令行界面``gdb -p pid //调试正在运行的进程

  3. 查看堆栈命令:

  • bt/where
  • 查看堆栈
  • bt full完整版,显示local变量
  • bt n 显示前n个堆栈
  1. 查看栈帧
  • frame //可简写为f
  • f + number表示去到对应的栈帧
  • up/down 栈帧上下切换
  1. 加断点
  • 命令:break 行号(或函数名) //break可简写为b
  • 显示所有断点:i b
  • 清除所有断点:d b
  • 删掉第n个断点:d n //n为断电号n
  • 清除第n行的断点:c n
  1. 运行程序:命令:run // 可简写为r

  2. 查看内存命令:x

  • examine
  • 查看内存
  • x/x 以十六进制输出
  • x/d 以十进制输出
  • x/c 以单字符输出
  • x/i 反汇编 – 通常,我们会使用 x/10i ip−20来查看当前的汇编(𝑖𝑝−20来查看当前的汇编(ip是指令寄存器)
  • x/s 以字符串输出命令: info locals //查看当前栈局部变量
  1. 列出源代码命令:list //简写为l

  2. 执行控制

  • next n
  • step s
  • continue c
  • until u
  1. 打印一系列表达式命令:print //可简写为p
    在这里插入图片描述
    在这里插入图片描述

压缩与解压

屌丝版

gzip

格式:gzip [OPTION]… [FILE]…

选项:

  • -k:保留输入文件(默认情况下,被压缩的文件会被删除)
  • -l:列出压缩文件内容
  • -r:对目录进行递归(子目录里面的内容也压缩)
  • -f:强制覆盖输出文件和压缩硬链接
  • -d:解压
压缩
gzip -k test.txt

-k选项表示压缩之后把test.txt保留下来,如果不加-k则会删除test.txt。

gzip -k *.txt

压缩当前目录所有.txt文件,注意:不会压缩成一个包,会分开压缩。

gzip -fk *

如果目录中有两个硬链接,则必须使用-f选项,强制压缩

解压
gzip -k -d test.txt.gz

-d选项表示解压

bzip

格式:bzip2 [OPTION]… [FILE]…

选项:

  • -k:保留输入文件(默认情况下,被压缩的文件会被删除)
  • -f:强制覆盖输出文件和压缩硬链接
  • -d:解压

bzip2相对gzip来说更简单,少了些许参数,基本操作一致;最大的区别是区别是:gzip压缩的速度快一些,而bzip2要压得狠一些(压缩之后包更小)。

高富帅

无论是gzip还是bzip2,都不能压缩目录,只能一个一个文件进行压缩,非常不方便。

所以有了更强大的工具:

tar

格式:tar [OPTION…] [FILE]…

选项:

  • -c 压缩

  • -x 解压

  • -v 显示提示信息(可以省略)

  • -f 指定压缩文件名称

  • -t 列出包内容

  • -k 提取时不要替换现有文件,将其视为错误

  • -z 使用gzip的方式压缩文件 .gz

  • -j 使用bzip的方式压缩文件 .bz2

压缩
  • tar cvf 生成的压缩包名.tar 要打包的文件

    • 如果没有指定压缩方式,则不会压缩,只会对文件进行打包
  • tar zcvf 生成的压缩包名.tar.gz 要打包压缩的文件

  • tar jcvf 生成的压缩包名.tar.bz2 要打包压缩的文件

解压缩
  • tar xvf 已有的压缩包(test.tar)

  • tar zxvf 已有的压缩包(test.tar.gz)

  • tar jxvf 已有的压缩包(test.tar.bz2)

如果要解压到指定的目录,可以使用-C选项。

tar zxvf test.tar.gz -C 解压目录(./mytest)

查看压缩包中有哪些文件

tar -tvf test.tar
rar

使用前需要安装 rar 工具sudo apt-get install rar

压缩

格式: rar a -r 要压缩的文件(含文件或者目录)

rar a -r my aa bb dir  ----将aa bb dir压缩到my.rar文件中

打包的生成的新文件不需要指定后缀

解压缩

格式:rar x xxx.rar 压缩目录

  • 解压到当前目录

    rar x my.rar  --将my.rar解压到当前目录
    
  • 解压到指定目录

    rar x my.rar animal --将my.rar解压到animal目录下
    
zip

使用前需要安装 rar 工具sudo apt-get install zip

压缩

格式:zip -r 压缩包包名 要压缩的文件

zip -r xxx file dir ---生成xxx.zip文件
解压缩

格式:unzip 压缩包名

  • 解压到当前目录

    unzip dir.zip
    
  • 解压到指定目录

    unzip dir.zip -d animal 
    

注意:解压目录若不存在则会创建.


http://www.niftyadmin.cn/n/5858133.html

相关文章

STM32的HAL库开发---单通道ADC采集实验

一、实验简要 1、功能描述 通过ADC1通道1&#xff08;PA1&#xff09;采集电位器的电压&#xff0c;并显示ADC转换的数字量及换算后的电压值 2、确定最小刻度 VREF 3.3V ---》 0V ≤ VIN ≤ 3.3V ---》最小刻度 3.3 / 4096 &#xff0c;F1的分辨率是12位的&#xff0c;也…

cmake:定位Qt的ui文件

如题。在工程中&#xff0c;将h&#xff0c;cpp&#xff0c;ui文件放置到不同文件夹下&#xff0c;会存在cmake找不到ui文件&#xff0c;导致编译报错情况。 cmake通过指定文件路径&#xff0c;确保工程找到ui文件。 标识1&#xff1a;ui文件保存路径。 标识2&#xff1a;添加…

网站搭建基本流程

需求分析&#xff1a; 实现网站搭建的过程&#xff1a;首先进行网站的需求性分析 网站可分为前台系统和后台系统&#xff0c;由不同的功能拆分为不同的模块 如下是一个电商网站可以拆分出的模块&#xff1a; 在编写代码前&#xff0c;我们要先对网站进行架构&#xff0c;通过…

Spring Boot 开发入门

文章来源&#xff1a;开发您的第一个 Spring Boot 应用程序 (Developing Your First Spring Boot Application) _ Spring Boot3.4.0中文文档(官方文档中文翻译)|Spring 教程 —— CADN开发者文档中心 本节介绍如何开发一个小型的 “Hello World&#xff01;” Web 应用程序&…

MVTEC数据集笔记

前言 网上的博客只有从论文里摘出的介绍&#xff0c;没有数据集文件详细的样子&#xff0c;下载数据集之后&#xff0c;对数据集具体的构成做一个补充的笔记。 下载链接&#xff1a;https://ai-studio-online.bj.bcebos.com/v1/7d4a3cf558254bbaaf4778ea336cb14ed8bbb96a7f2a…

Pycharm打开的jupyter notebook无法在pycharm中关闭怎么解决

首先你可以先看一下你的pycharm的jupyter界面的输出&#xff1a; 可以看到第一行有个启动命令 找到这个–port的端口号&#xff0c;现在我们可以走下面的步骤&#xff0c;假设你找到的是–port47187 &#xff1a; 步骤 1&#xff1a;定位占用端口的进程&#xff08;Linux/Mac…

【JAVA工程师从0开始学AI】,第二步:从强类型到动态语言:Java工程师的Python语法避坑指南

这是一篇介绍Python语法与JAVA语法区别文章&#xff0c;让我们以对比的方式&#xff0c;来学习一下Python的语法。 首先我们看一下下面的Python代码&#xff0c;和具体在java 当中分别代表了什么意思 numbers [1,2,3,4,5,6,7,8,9] # ① 创建数字列表&#xff08;像Java的Ar…

高子昂医编---23岁,医疗编上岸,正式开启养老生活

作为一个只想毕业后就找个稳定工作躺平一生的普通人&#xff0c;直接放弃加入考研考公大军&#xff0c;加入了竞争稍微小一点的考编大军&#xff01;毕业那年在学校辛苦奋斗四个多月&#xff0c;直接一战上岸&#xff01;成为了一名有编制的医务工作者&#xff01;现在在我们家…