当前位置: 首页 > news >正文

Linux:3_基础开发⼯具

基础开发⼯具

一.软件包管理器

image-20250619232425873

1. 什么是软件包

  • 在Linux下安装软件, ⼀个通常的办法是下载到程序的源代码, 并进⾏编译, 得到可执⾏程序.
  • 但是这样太⿇烦了, 于是有些⼈把⼀些常⽤的软件提前编译好, 做成软件包(可以理解成windows上的安装程序)放在⼀个服务器上, 通过包管理器可以很⽅便的获取到这个编译好的软件包, 直接进⾏安装.
  • 软件包和软件包管理器, 就好⽐ “App” 和 “应⽤商店” 这样的关系.
  • yum(Yellow dog Updater, Modified)是Linux下⾮常常⽤的⼀种包管理器. 主要应⽤在Fedora,RedHat, Centos等发⾏版上.
  • Ubuntu:主要使⽤apt(Advanced Package Tool)作为其包管理器。apt同样提供了⾃动解决依赖关系、下载和安装软件包的功能。

2. Linux软件⽣态

  • Linux下载软件的过程(Ubuntu、Centos、other)

image-20250619232446871

  • 操作系统的好坏评估— ⽣态问题

image-20250619232759248

  • 为什么会有⼈免费特定社区提供软件,还发布?还提供云服务器让你下载?

系统开发者希望更多人用这个系统,会为系统建立较为完善的软件体系。

image-20250619232541089

  • 软件包依赖的问题

image-20250619232732945

  • 国内镜像源

image-20250619232825024

💡 以下是⼀些国内Linux软件安装源的官⽅链接[由⽂⼼⼀⾔⽣成]:

  1. 阿⾥云官⽅镜像站
  • 官⽅链接:https://developer.aliyun.com/mirror/
  • 阿⾥云提供了丰富的Linux发⾏版镜像,包括CentOS、Ubuntu、Debian等,⽤⼾可以通过该镜像站快速下载和更新软件包。
  1. 清华⼤学开源软件镜像站
  • 官⽅链接:https://mirrors.tuna.tsinghua.edu.cn/
  • 清华⼤学镜像站提供了多种Linux发⾏版的镜像,以及Python、Perl、Ruby等编程语⾔的扩展包。该镜像站还提供了丰富的⽂档和教程,帮助⽤⼾更好地使⽤这些软件包。
  1. 中国科学技术⼤学开源镜像站
  • 官⽅链接:http://mirrors.ustc.edu.cn/
  • 中科⼤镜像站提供了多种Linux发⾏版的镜像,以及常⽤的编程语⾔和开发⼯具。⽤⼾可以通过该镜像站⽅便地获取所需的软件包和⼯具。
  1. 北京交通⼤学⾃由与开源软件镜像站
  • 官⽅链接:https://mirror.bjtu.edu.cn/
  • 北交⼤镜像站提供了多种Linux发⾏版的镜像,以及相关的软件仓库和⼯具。该镜像站还提供了详细的⽂档和指南,帮助⽤⼾配置和使⽤这些软件源。
  1. 中国科学院软件研究所镜像站(ISCAS)
  • 官⽅链接:http://mirror.iscas.ac.cn/
  • ISCAS镜像站提供了多种Linux发⾏版、编程语⾔和开发⼯具的镜像。⽤⼾可以通过该镜像站快速获取所需的软件包和更新。
  1. 上海交通⼤学开源镜像站
  • 官⽅链接:https://ftp.sjtu.edu.cn/
  • 上海交⼤镜像站提供了丰富的Linux软件资源,包括多种发⾏版的镜像和软件仓库。⽤⼾可以通过该镜像站⽅便地下载和安装所需的软件包。
  1. ⽹易开源镜像站
  • 官⽅链接:http://mirrors.163.com/
  • ⽹易镜像站提供了多种Linux发⾏版的镜像,以及相关的软件仓库和⼯具。该镜像站还提供了便捷的搜索功能,帮助⽤⼾快速找到所需的软件包。

此外,还有⼀些其他的国内镜像源,如搜狐开源镜像站等,但可能由于时间变化或政策调整,部分镜像站的链接或状态可能有所变动。因此,建议⽤⼾在使⽤前访问官⽅⽹站或咨询相关社区以获取最新的信息和帮助。

image-20250619234047743

sudo yum install -y epel-release #安装扩展软件源

3. yum具体操作

(1).查看软件包

通过 yum list 命令可以罗列出当前⼀共有哪些软件包. 由于包的数⽬可能⾮常之多, 这⾥我们需要使⽤grep 命令只筛选出我们关注的包. 例如:

image-20250619234301439

注意事项:

  • 软件包名称: 主版本号.次版本号.源程序发⾏号-软件包的发⾏号.主机平台.cpu架构.
  • “x86_64” 后缀表⽰64位系统的安装包, “i686” 后缀表⽰32位系统安装包. 选择包时要和系统匹配.
  • “el7” 表⽰操作系统发⾏版的版本. “el7” 表⽰的是 centos7/redhat7. “el6” 表⽰ centos6/redhat6.
  • 最后⼀列, base 表⽰的是 “软件源” 的名称, 类似于 “⼩⽶应⽤商店”, “华为应⽤商店” 这样的概念.
  • Ubuntu 有上述有详细介绍
(2).安装软件

通过 yum, 我们可以通过很简单的⼀条命令完成 gcc 的安装.

image-20250619234912973

  • yum/apt 会⾃动找到都有哪些软件包需要下载, 这时候敲 “y” 确认安装.
  • 出现 “complete” 字样或者中间未出现报错, 说明安装完成.

注意事项:

  • 安装软件时由于需要向系统⽬录中写⼊内容, ⼀般需要 sudo 或者切到 root 账⼾下才能完成.

  • yum/apt安装软件只能⼀个装完了再装另⼀个. 正在yum/apt安装⼀个软件的过程中, 如果再尝试⽤yum/apt安装另外⼀个软件, yum/apt会报错.

  • 如果 yum / apt报错, 请⾃⾏百度.

  • Linux⼀般⽽⾔,软件只要安装⼀次,所有⼈都能⽤!⾮root⽤户本质以other身份使⽤!

(3).卸载软件

仍然是⼀条命令:

image-20250619234945339

(4).注意事项

关于 yum / apt 的所有操作必须保证主机(虚拟机)⽹络畅通!!!

可以通过 ping 指令验证

image-20250714112611211

4. 安装源

切换软件源:本质就是更改配置⽂件!

Centos 安装源路径:

image-20250714112811828

Ubuntu 安装源路径:

image-20250714112854893

更新安装源,理解原理即可。云服务器不⽤考虑,因为软件源都是国内的了.

好玩的命令:https://blog.csdn.net/xiaoxiaosutang/article/details/141053674

image-20250714120129827

二.编辑器Vim

image-20250714113030950

IDE例⼦

image-20250714113104330

1. Linux编辑器-vim使⽤

vi/vim的区别简单点来说,它们都是多模式编辑器,不同的是vim是vi的升级版本,它不仅兼容vi的所有指令,⽽且还有⼀些新的特性在⾥⾯。例如语法加亮,可视化操作不仅可以在终端运⾏,也可以运⾏于x window、 mac os、 windows。我们课堂上,统⼀按照vim来进⾏讲解。

2. vim的基本概念

我们讲解vim的三种模式(其实有好多模式,⽬前掌握这3种即可),分别是命令模式(command mode)、插⼊模式(Insert mode)和底⾏模式(last line mode),各模式的功能区分如下:

  • 正常/普通/命令模式(Normal mode)

    控制屏幕光标的移动,字符、字或⾏的删除,移动复制某区段及进⼊Insert mode下,或者到 last line mode

  • 插⼊模式(Insert mode)

    只有在Insert mode下,才可以做⽂字输⼊,按「ESC」键可回到命令⾏模式。该模式是我们后⾯⽤的最频繁的编辑模式。

  • 末⾏模式(last line mode)

    ⽂件保存或退出,也可以进⾏⽂件替换,找字符串,列出⾏号等操作。
    在命令模式下,shift + : 即可进⼊该模式。要查看你的所有模式:打开 vim,底⾏模式直接输⼊
    :help vim-modes

我这⾥⼀共有12种模式:six BASIC modes和six ADDITIONAL modes.

image-20250714113703751

3. vim的基本操作

  • 进⼊vim,在系统提⽰符号输⼊vim及⽂件名称后,就进⼊vim全屏幕编辑画⾯:

    • vim test.c
    • 不过有⼀点要特别注意,就是你进⼊vim之后,是处于[正常模式],你要切换到[插⼊模式]才能够输⼊⽂字。
  • [正常模式]切换⾄[插⼊模式]

    • 输⼊a
    • 输⼊i
    • 输⼊o
  • [插⼊模式]切换⾄[正常模式]

    • ⽬前处于[插⼊模式],就只能⼀直输⼊⽂字,如果发现输错了字,想⽤光标键往回移动,将该字删除,可以先按⼀下「ESC」键转到[正常模式]再删除⽂字。当然,也可以直接删除。
  • [正常模式]切换⾄[末⾏模式]

    • 「shift + ;」, 其实就是输⼊「:」
  • 退出vim及保存⽂件,在[正常模式]下,按⼀下「:」冒号键进⼊「Last line mode」,例如:

    • : w (保存当前⽂件)
    • : wq (输⼊「wq」,存盘并退出vim)
    • : q! (输⼊q!,不存盘强制退出vim)

4. vim正常模式命令集

不加特定说明的情况下,大部分的命令前面都可以加数字(下面#是数字的意思.)

  • 插⼊模式

    • 按「i」切换进⼊插⼊模式「insert mode」,按“i”进⼊插⼊模式后是从光标当前位置开始输⼊⽂件;
    • 按「a」进⼊插⼊模式后,是从⽬前光标所在位置的下⼀个位置开始输⼊⽂字;
    • 按「o」进⼊插⼊模式后,是插⼊新的⼀⾏,从⾏⾸开始输⼊⽂字。
  • 从插⼊模式切换为命令模式

    • 按「ESC」键。
  • 移动光标

    • vim可以直接⽤键盘上的光标来上下左右移动,但正规的vim是⽤⼩写英⽂字⺟「h」、「j」、「k」、「l」,分别控制光标左、下、上、右移⼀格(尽量不要用上下左右键)
    • 按「G」:移动到⽂章的最后
    • 按「 $ 」:移动到光标所在⾏的“⾏尾”
    • 按「^」:移动到光标所在⾏的“⾏⾸”
    • 按「w」:光标跳到下个字的开头
    • 按「e」:光标跳到下个字的字尾
    • 按「b」:光标回到上个字的开头
    • 按「#l」:光标移到该⾏的第#个位置,如:5l,56l
    • 按[gg]:进⼊到⽂本开始
    • 按[shift+g]:进⼊⽂本末端
    • 按「ctrl」+「b」:屏幕往“后”移动⼀⻚
    • 按「ctrl」+「f」:屏幕往“前”移动⼀⻚
    • 按「ctrl」+「u」:屏幕往“后”移动半⻚
    • 按「ctrl」+「d」:屏幕往“前”移动半⻚
  • 删除⽂字

    • 「x」:每按⼀次,剪切光标所在位置的⼀个字符
    • 「#x」:例如,「6x」表⽰剪切光标所在位置的“后⾯(包含⾃⼰在内)”6个字符
    • 「X」:⼤写的X,每按⼀次,剪切光标所在位置的“前⾯”⼀个字符
    • 「#X」:例如,「20X」表⽰剪切光标所在位置的“前⾯”20个字符
    • 「dd」:剪切光标所在⾏
    • 「#dd」:从光标所在⾏开始剪切#⾏
  • 复制

    • 「yw」:将光标所在之处到字尾的字符复制到缓冲区中。
    • 「#yw」:复制#个字到缓冲区
    • 「yy」:复制光标所在⾏到缓冲区。
    • 「#yy」:例如,「6yy」表⽰拷⻉从光标所在的该⾏“往下数”6⾏⽂字。
    • 「p」:将缓冲区内的字符贴到光标所在位置。注意:所有与“y”有关的复制命令都必须与“p”配合才能完成复制与粘贴功能。(注:粘贴到当前行的下一行)
  • 替换

    • 「r」:替换光标所在处的字符。
    • 「R」:替换光标所到之处的字符,直到按下「ESC」键为⽌。
  • 撤销上⼀次操作

    • 「u」:如果您误执⾏⼀个命令,可以⻢上按下「u」,回到上⼀个操作。按多次“u”可以执⾏多次回复。
    • 「ctrl + r」: 撤销的恢复
    • 只要不退vim,都可以撤销或恢复
  • 更改

    • 「cw」:更改光标所在处的字到字尾处
    • 「c#w」:例如,「c3w」表⽰更改3个字
  • 跳⾄指定的⾏

    • 「ctrl」+「g」:列出光标所在⾏的⾏号。
    • 「#G」:例如,「15G」,表⽰移动光标⾄⽂章的第15⾏ ⾸。
  • 退出vim

    • 「shift」+「z」+「z」:保存并退出vim

5. vim末⾏模式命令集

在使⽤末⾏模式之前,请记住先按「ESC」键确定您已经处于正常模式,再按「:」冒号即可进⼊末⾏模式。

  • 不退出vim的情况下执⾏命令:!command
  • 分屏操作:vs 其他⽂件名(注:光标在哪个⽂件操作的就是哪个⽂件,在命令模式下ctrl+ww可将光标切到下⼀个⽂件)
  • 列出⾏号
    • 「set nu」: 输⼊「set nu」后,会在⽂件中的每⼀⾏前⾯列出⾏号。set nonu:不显示⾏号。
  • 跳到⽂件中的某⼀⾏
    • 「#」:「#」号表⽰⼀个数字,在冒号后输⼊⼀个数字,再按回⻋键就会跳到该⾏了,如输⼊数字15,再回⻋,就会跳到⽂章的第15⾏。
  • 查找字符
    • 「/关键字」: 先按「/」键,再输⼊您想寻找的字符,如果第⼀次找的关键字不是您想要的,可以⼀直按「n」会往后寻找到您要的关键字为⽌。
    • 「?关键字」:先按「?」键,再输⼊您想寻找的字符,如果第⼀次找的关键字不是您想要的,可以⼀直按「n」会往前寻找到您要的关键字为⽌。
  • 保存⽂件
    • 「w」: 在冒号输⼊字⺟「w」就可以将⽂件保存起来,w+!强制保存
  • 离开vim
    • 「q」:按「q」就是退出,如果⽆法离开vim,可以在「q」后跟⼀个「!」强制离开vim。
    • 「wq⼀般建议离开时,搭配「w」⼀起使⽤,这样在退出的时候还可以保存⽂件。
    • 「wq!」:强制保存并退出

6. vim操作总结

  • 三种模式

    • 正常模式
    • 插⼊模式
    • 底⾏模式
  • 我们⼀共有12种总模式,⼤家下来可以研究⼀下

  • vim操作

    • 打开,关闭,查看,查询,插⼊,删除,替换,撤销,复制等等操作。

image-20250714120305038

image-20250714120616391

7.简单vim配置[了解]

配置⽂件的位置

  • 在⽬录 /etc/ 下⾯,有个名为vimrc的⽂件,这是系统中公共的vim配置⽂件,对所有⽤⼾都有效。一般情况下不要改全局的
  • ⽽在每个⽤⼾的主⽬录下,都可以⾃⼰建⽴私有的配置⽂件,命名为:“.vimrc”。例如,/root⽬录下,通常已经存在⼀个.vimrc⽂件,如果不存在,则创建之。
  • 切换⽤⼾成为⾃⼰执⾏ su ,进⼊⾃⼰的主⼯作⽬录,执⾏ cd ~
  • 打开⾃⼰⽬录下的.vimrc⽂件,执⾏ vim .vimrc

常⽤配置选项,⽤来测试

  • 设置语法⾼亮: syntax on
  • 显⽰⾏号: set nu
  • 设置缩进的空格数为4: set shiftwidth=4

使⽤插件

⽤插件需要先在⾃⼰的家⽬录⾥⾯新建⼀个.vim的⽬录,要配置好看的vim,原⽣的配置可能功能不全,可以选择安装插件来完善配置,保证⽤⼾是你要配置的⽤⼾,接下来:

  • 安装TagList插件,下载taglist_xx.zip ,解压完成,将解压出来的doc的内容放到〜/.vim/doc, 将解压出来的plugin下的内容拷⻉到〜/.vim/plugin
  • 在〜/.vimrc 中添加: let Tlist_Show_One_File=1 let Tlist_Exit_OnlyWindow=1 let Tlist_Use_Right_Window=1
  • 安装⽂件浏览器和窗⼝管理器插件: WinManager
  • 下载winmanager.zip,2.X版本以上的
  • 解压winmanager.zip,将解压出来的doc的内容放到〜/.vim/doc, 将解压出来的plugin下的内容拷⻉到〜/.vim/plugin
  • 在〜/.vimrc 中添加 let g:winManagerWindowLayout=‘FileExplorer|TagList nmap wm :WMToggle<cr>
  • 然后重启vim,打开~/XXX.c或〜/XXX.cpp, 在normal状态下输⼊"wm", 你将看到上图的效果。更具体移步:点我, 其他⼿册,请执⾏ vimtutor 命令。

image-20250714121355574

参考资料
Vim从⼊⻔到⽜逼(vim from zero to hero)

8. 一键配置

image-20250714121658806

三.编译器gcc/g++

image-20250714121835305

1. 背景知识

  1. 预处理(进⾏宏替换/去注释/条件编译/头⽂件展开等)
  2. 编译(⽣成汇编)
  3. 汇编(⽣成机器可识别代码)
  4. 连接(⽣成可执⾏⽂件或库⽂件)

2. gcc编译选项

  • 帮助记忆:键盘左上⻆ESc按顺序对应编译选项,⽣成的⽂件类型iso(镜像⽂件后缀)

格式 gcc [选项] 要编译的⽂件 [选项] [⽬标⽂件] 不带-o指定⽂件,会⾃动⽣成对应后缀同名⽂件

(1).预处理(进⾏宏替换)

C/C++头⽂件⼀般在/usr/include/⾥

image-20250714122005373

  • 预处理功能主要包括宏定义,⽂件包含,条件编译,去注释等。
  • 预处理指令是以#号开头的代码⾏。
  • 实例: gcc –E hello.c –o hello.i (将预处理后的内容输⼊到hello.i⽂件)
  • 选项“-E”,该选项的作⽤是让 gcc 在预处理结束后停⽌编译过程。
  • 选项“-o”是指⽬标⽂件,“.i”⽂件为已经过预处理的C原始程序。
(2).编译(⽣成汇编)
  • 在这个阶段中,gcc ⾸先要检查代码的规范性、是否有语法错误等,以确定代码的实际要做的⼯作,在检查⽆误后,gcc 把代码翻译成汇编语⾔。
  • ⽤⼾可以使⽤“-S”选项来进⾏查看,该选项只进⾏编译⽽不进⾏汇编,⽣成汇编代码。
  • 实例: gcc –S hello.i –o hello.s
(3).汇编(⽣成机器可识别代码)
  • 汇编阶段是把编译阶段⽣成的“.s”⽂件转成⽬标⽂件
  • 读者在此可使⽤选项“-c”就可看到汇编代码已转化为“.o”的⼆进制⽬标代码了
  • 实例: gcc –c hello.s –o hello.o (.o⽂件叫做可重定位⽬标⼆进制⽂件,⽆法执⾏)
(4).连接(⽣成可执⾏⽂件或库⽂件)可执⾏⽂件没有后缀
  • 在成功编译之后,就进⼊了链接阶段。
  • 实例: gcc hello.o –o hello (我们的.o⽂件和库⽂件进⾏链接->可执⾏)

3. 动态链接和静态链接

gcc默认形成的可执⾏程序是动态链接的

在我们的实际开发中,不可能将所有代码放在⼀个源⽂件中,所以会出现多个源⽂件,⽽且多个源⽂件之间不是独⽴的,⽽会存在多种依赖关系,如⼀个源⽂件可能要调⽤另⼀个源⽂件中定义的函数,但是每个源⽂件都是独⽴编译的,即每个*.c⽂件会形成⼀个*.o⽂件,为了满⾜前⾯说的依赖关系,则需要将这些源⽂件产⽣的⽬标⽂件进⾏链接,从⽽形成⼀个可以执⾏的程序。这个链接的过程就是静态链接。静态链接的缺点很明显:

  • 浪费空间:因为每个可执⾏程序中对所有需要的⽬标⽂件都要有⼀份副本,所以如果多个程序对同⼀个⽬标⽂件都有依赖,如多个程序中都调⽤了printf()函数,则这多个程序中都含有printf.o,所以同⼀个⽬标⽂件都在内存存在多个副本;
  • 更新⽐较困难:因为每当库函数的代码修改了,这个时候就需要重新进⾏编译链接形成可执⾏程序。但是静态链接的优点就是,在可执⾏程序中已经具备了所有执⾏程序所需要的任何东西,在执⾏的时候运⾏速度快。

动态链接的出现解决了静态链接中提到问题。动态链接的基本思想是把程序按照模块拆分成各个相对独⽴部分,在程序运⾏时才将它们链接在⼀起形成⼀个完整的程序,⽽不是像静态链接⼀样把所有程序模块都链接成⼀个单独的可执⾏⽂件。

动态链接其实远⽐静态链接要常⽤得多。⽐如我们查看下 hello 这个可执⾏程序依赖的动态库,会发现它就⽤到了⼀个c动态链接库:

image-20250714124047459

在这⾥涉及到⼀个重要的概念: 库

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

image-20250714124248614

4. 静态库和动态库

  • 静态库是指编译链接时,把库⽂件的代码全部加⼊到可执⾏⽂件中,因此⽣成的⽂件⽐较⼤,但在运⾏时也就不再需要库⽂件了。其后缀名⼀般为“.a”
  • 动态库与之相反,在编译链接时并没有把库⽂件的代码加⼊到可执⾏⽂件中,⽽是在程序执⾏时由运⾏时链接⽂件加载库,这样可以节省系统的开销。动态库⼀般后缀名为“.so”,如前⾯所述的libc.so.6 就是动态库。gcc 在编译时默认使⽤动态库。完成了链接之后,gcc 就可以⽣成可执⾏⽂件,如下所⽰。 gcc hello.o –o hello
  • gcc默认⽣成的⼆进制程序,是动态链接的,这点可以通过 file 命令验证。

image-20250714124747502

⼀般我们的云服务器,C/C++的静态库并没有安装,可以采⽤如下⽅法安装

image-20250714124651100

image-20250714124720295

5. gcc其他常⽤选项 - 了解即可

  • -E 只激活预处理,这个不⽣成⽂件,你需要把它重定向到⼀个输出⽂件⾥⾯
  • -S 编译到汇编语⾔不进⾏汇编和链接
  • -c 编译到⽬标代码
  • -o ⽂件输出到 ⽂件
  • -static 此选项对⽣成的⽂件采⽤静态链接
  • -g ⽣成调试信息。GNU 调试器可利⽤该信息。
  • -shared 此选项将尽量使⽤动态库,所以⽣成⽂件⽐较⼩,但是需要系统由动态库.
  • -O0
  • -O1
  • -O2
  • -O3 编译器的优化选项的4个级别,-O0表⽰没有优化,-O1为缺省值,-O3优化级别最⾼
  • -w 不⽣成任何警告信息。
  • -Wall ⽣成所有警告信息。

四.⾃动化构建-make/Makefile

image-20250714125011295

1. 背景

  • 会不会写makefile,从⼀个侧⾯说明了⼀个⼈是否具备完成⼤型⼯程的能⼒
  • ⼀个⼯程中的源⽂件不计数,其按类型、功能、模块分别放在若⼲个⽬录中,makefile定义了⼀系列的规则来指定,哪些⽂件需要先编译,哪些⽂件需要后编译,哪些⽂件需要重新编译,甚⾄于进⾏更复杂的功能操作
  • makefile带来的好处就是⸺“⾃动化编译”,⼀旦写好,只需要⼀个make命令,整个⼯程完全
    ⾃动编译,极⼤的提⾼了软件开发的效率。
  • make是⼀个命令⼯具,是⼀个解释makefile中指令的命令⼯具,⼀般来说,⼤多数的IDE都有这个命令,⽐如:Delphi的make,Visual C++的nmake,Linux下GNU的make。可⻅,makefile都成为了⼀种在⼯程⽅⾯的编译⽅法。
  • make是⼀条命令,makefile是⼀个⽂件,两个搭配使⽤,完成项⽬⾃动化构建。

2. 基本使⽤

实例代码

image-20250714125235380

Makefile⽂件

image-20250714125612720

依赖关系(给make命令⽤)

  • 上⾯的⽂件myproc,它依赖myproc.c

依赖⽅法(给make命令⽤)

  • gcc -o myproc myproc.c ,就是与之对应的依赖关系

依赖关系和依赖⽅法,形成⽬标⽂件

⽤make指令时会⾃定向下扫描makefile⽂件,默认形成第⼀个⽬标⽂件;如果想指定形成,make targetname

项⽬清理(给make clean命令⽤)

  • ⼯程是需要被清理的
  • 像clean这种,没有被第⼀个⽬标⽂件直接或间接关联,那么它后⾯所定义的命令将不会被⾃动执⾏,不过,我们可以显⽰要make执⾏。即命令⸺“make clean”,以此来清除所有的⽬标⽂件,以便重编译。
  • 但是⼀般我们这种clean的⽬标⽂件,我们将它设置为伪⽬标,⽤ .PHONY 修饰,伪⽬标的特性是,总是被执⾏的。

image-20250714125945157

  • 可以将我们的 hello ⽬标⽂件声明成伪⽬标,测试⼀下。

image-20250714130313214

image-20250714130325559

3. 推导过程

make会进⾏依赖关系的推导,直到依赖⽂件是存在的;将依赖⽅法不断⼊栈,推导完毕,出栈执⾏⽅法!

image-20250714130521078

编译

image-20250714130538608

image-20250714130549084

  • make是如何⼯作的,在默认的⽅式下,也就是我们只输⼊make命令。那么:
    1. make会在当前⽬录下找名字叫“Makefile”或“makefile”的⽂件。
    2. 如果找到,它会找⽂件中的第⼀个⽬标⽂件(target),在上⾯的例⼦中,他会找到 myproc 这个⽂件,并把这个⽂件作为最终的⽬标⽂件。
    3. 如果 myproc ⽂件不存在,或是 myproc 所依赖的后⾯的 myproc.o ⽂件的⽂件修改时间要⽐ myproc 这个⽂件新(可以⽤ touch 测试),那么,他就会执⾏后⾯所定义的命令来⽣成myproc 这个⽂件。
    4. 如果 myproc 所依赖的 myproc.o ⽂件不存在,那么 make 会在当前⽂件中找⽬标为myproc.o ⽂件的依赖性,如果找到则再根据那⼀个规则⽣成 myproc.o ⽂件。(这有点像⼀个堆栈的过程)
    5. 当然,你的C⽂件和H⽂件是存在的啦,于是 make 会⽣成 myproc.o ⽂件,然后再⽤myproc.o ⽂件声明 make 的终极任务,也就是执⾏⽂件 hello 了。
    6. 这就是整个make的依赖性,make会⼀层⼜⼀层地去找⽂件的依赖关系,直到最终编译出第⼀个⽬标⽂件。
    7. 在找寻的过程中,如果出现错误,⽐如最后被依赖的⽂件找不到,那么make就会直接退出,并报错,⽽对于所定义的命令的错误,或是编译不成功,make根本不理。
    8. make只管⽂件的依赖性,即,如果在我找了依赖关系之后,冒号后⾯的⽂件还是不在,那么对不起,我就不⼯作啦。

4. 适度扩展语法

image-20250714131122216

五.Linux第⼀个系统程序−进度条

1. 补充 - 回⻋与换⾏

  • 回⻋概念:\r 回到当前⾏最初始位置
  • 换⾏概念:\n 转到当前位置下⼀⾏
  • 注:C语⾔的\n承担了回⻋和换⾏的两个功能

2. ⾏缓冲区

代码⼀定从上向下执⾏

image-20250714174709778

3. 练⼿ - 倒计时程序

image-20250714175021784

4. 进度条代码

image-20250714175439917

image-20250714175452890

六.版本控制器Git(去中⼼化,分布式的版本控制)

不知道你⼯作或学习时,有没有遇到这样的情况:我们在编写各种⽂档时,为了防⽌⽂档丢失,更改失误,失误后能恢复到原来的版本,不得不复制出⼀个副本,⽐如:

“报告-v1”

“报告-v2”

“报告-v3”

“报告-确定版”

“报告-最终版”

“报告-究极进化版”

每个版本有各⾃的内容,但最终会只有⼀份报告需要被我们使⽤ 。

但在此之前的⼯作都需要这些不同版本的报告,于是每次都是复制粘贴副本,产出的⽂件就越来越多,⽂件多不是问题,问题是:随着版本数量的不断增多,你还记得这些版本各⾃都是修改了什么吗?

⽂档如此,我们写的项⽬代码,也是存在这个问题的!!

1. 版本控制器

为了能够更⽅便我们管理这些不同版本的⽂件,便有了版本控制器。所谓的版本控制器,就是能让你了解到⼀个⽂件的历史,以及它的发展过程的系统。通俗的讲就是⼀个可以记录⼯程的每⼀次改动和版本迭代的⼀个管理系统,同时也⽅便多⼈协同作业。

⽬前最主流的版本控制器就是 Git 。Git 可以控制电脑上所有格式的⽂件,例如 doc、excel、dwg、dgn、rvt等等。对于我们开发⼈员来说,Git 最重要的就是可以帮助我们管理软件开发项⽬中的源代码⽂件!

仓库就相当于⼀共⽂件夹

2. git 简史

同⽣活中的许多伟⼤事物⼀样,Git 诞⽣于⼀个极富纷争⼤举创新的年代。

Linux 内核开源项⽬有着为数众多的参与者。 绝⼤多数的 Linux 内核维护⼯作都花在了提交补丁和保存归档的繁琐事务上(1991−2002年间)。 到 2002 年,整个项⽬组开始启⽤⼀个专有的分布式版本控制系统 BitKeeper 来管理和维护代码。

到了 2005 年,开发 BitKeeper 的商业公司同 Linux 内核开源社区的合作关系结束,他们收回了 Linux内核社区免费使⽤ BitKeeper 的权⼒。 这就迫使 Linux 开源社区(特别是 Linux 的缔造者 Linus Torvalds)基于使⽤ BitKeeper 时的经验教训,开发出⾃⼰的版本系统。 他们对新的系统制订了若⼲⽬标:

  • 速度
  • 简单的设计
  • 对⾮线性开发模式的强⼒⽀持(允许成千上万个并⾏开发的分⽀)
  • 完全分布式
  • 有能⼒⾼效管理类似 Linux 内核⼀样的超⼤规模项⽬(速度和数据量)

⾃诞⽣于 2005 年以来,Git ⽇臻成熟完善,在⾼度易⽤的同时,仍然保留着初期设定的⽬标。 它的速度⻜快,极其适合管理⼤项⽬,有着令⼈难以置信的⾮线性分⽀管理系统。

3. 安装 git

image-20250714180106719

4. 在 Github 创建项⽬

注册账号

这个⽐较简单, 参考着官⽹提⽰即可. 需要进⾏邮箱校验.

创建项⽬

  1. 登陆成功后, 进⼊个⼈主⻚, 点击左下⽅的 New repository 按钮新建项⽬

image-20250714185325754

  1. 然后跳转到的新⻚⾯中输⼊项⽬名称(注意, 名称不能重复, 系统会⾃动校验. 校验过程可能会花费⼏秒钟). 校验完毕后, 点击下⽅的 Create repository 按钮确认创建.

image-20250714185357148

  1. 在创建好的项⽬⻚⾯中复制项⽬的链接, 以备接下来进⾏下载.

image-20250714185416085

下载项⽬到本地

创建好⼀个放置代码的⽬录.
image-20250714185450177
这⾥的 url 就是刚刚建⽴好的 项⽬ 的链接.

5. 三板斧

  1. git add
    将代码放到刚才下载好的⽬录中

    image-20250714185646652

    将需要⽤ git 管理的⽂件告知 git

    image-20250714185935909

  2. git commit
    提交改动到本地

    image-20250714185958292

    最后的 “.” 表⽰当前⽬录
    提交的时候应该注明提交⽇志, 描述改动的详细内容.

  3. git push

    同步到远端服务器上

    image-20250714190130903

    需要填⼊⽤⼾名密码. 同步成功后, 刷新 Github ⻚⾯就能看到代码改动了.

    配置免密码提交

    https://blog.csdn.net/camillezj/article/details/55103149

    image-20250714190114871

  4. 其他
    image-20250714190244345

七.调试器 - gdb/cgdb使⽤

1. 样例代码

image-20250714190411519

2. 预备

  • 程序的发布⽅式有两种, debug 模式和 release 模式, Linux gcc/g++ 出来的⼆进制程序,默认是 release 模式。

  • 要使⽤gdb调试,必须在源代码⽣成⼆进制程序的时候, 加上 -g 选项,如果没有添加,程序⽆法被编译

  • -g选项,让最后形成的可执⾏程序,添加调试信息–debug模式;gdb只调试携带调试信息的exe⽂件.

image-20250714190855065

3. 常⻅使⽤

image-20250714191058145

4. 常⻅技巧 - 加餐

image-20250714191150712

(1).watch(也是断点,⽤d删除)

执⾏时监视⼀个表达式(如变量)的值。如果监视的表达式在程序运⾏期间的值发⽣变化,GDB 会暂停程序的执⾏,并通知使⽤者

image-20250714191455492

(2).set var确定问题原因(调试期间改变变量值)

更改⼀下标志位,假设我们想得到 +-result

image-20250714191813964

(3).条件断点

添加条件断点

image-20250714191954544

给已经存在的端点新增条件

image-20250714192513703

http://www.dtcms.com/a/279190.html

相关文章:

  • JAVA面试宝典 - 《MyBatis 进阶:插件开发与二级缓存》
  • 理解:进程、线程、协程
  • muduo面试准备
  • 文本预处理(四)
  • 2025-7-14-C++ 学习 排序(2)
  • 【LeetCode 热题 100】94. 二叉树的中序遍历——DFS
  • 死锁!哲学家进餐问题(操作系统os)
  • 光电融合新范式:长春光机所孙晓娟/李大冰团队《Light》发表铁电量子阱相纯度调控策略
  • 系统分析师第五课:进程通信-死锁-存储管理-固定分页分段
  • SpringMVC注解:@RequestParam 与 @PathVariable
  • 详解同步、异步、阻塞、非阻塞
  • 关于机械臂控制中的 MoveL 和 MoveJ 操作
  • Spring Boot + Thymeleaf + RESTful API 前后端整合完整示例
  • FBRT-YOLO: Faster and Better for Real-Time Aerial Image Detection论文精读(逐段解析)
  • linux服务器换ip后客户端无法从服务器下载数据到本地问题处理
  • 学生管理系统(C++实现)
  • 13.梯度scharr与lapkacia算子
  • 成都,工业设备边缘计算如何落地?——“边缘智能”新解法!
  • Linux入门:从文件存储到常用命令详解
  • 从数据库到播放器:Java视频续播功能完整实现解析
  • simscape中坐标系和坐标变换Frames and Transforms
  • MySQL数据实时同步到Elasticsearch的高效解决方案
  • 小波变换 | 连续小波变换
  • Effective Modern C++ 条款10:优先考虑限域enum而非未限域enum
  • 安全架构中身份与访问管理体系设计
  • 基于Yolov8车辆检测及图像处理系统【有代码】
  • python多版本管理--pyenv
  • pyspark中map算子和flatmap算子
  • RAG优化
  • Mysql数据库学习--约束