【Linux】环境基础开发工具使用

【Linux】环境基础开发工具使用

一、Linux 软件包管理器 yum

1.1什么是软件包

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

1.2注意事项

关于 yum 的所有操作必须保证主机(虚拟机)网络畅通!!!
我们可以通过**ping指令来判断当前主机(虚拟机)**器是否联网。
在这里插入图片描述

1.3查看软件包

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

yum list | grep lrzsz
yum list | grep vim

结果如下:
在这里插入图片描述
上面的这个操作相当于我们在手机上面搜索我们想要下载的软件。
注意事项:

  • 软件包名称: 主版本号.次版本号.源程序发行号-软件包的发行号.主机平台.cpu架构.
  • “x86_64” 后缀表示64位系统的安装包,“i686” 后缀表示32位系统安装包. 选择包时要和系统匹配.
  • “el7” 表示操作系统发行版的版本. “el7” 表示centos7/redhat7. “el6” 表示 centos6/redhat6.
  • 最后一列, base 表示的是 “软件源” 的名称,类似于 “小米应用商店”, “华为应用商店” 这样的概念.

1.4如何安装软件

通过 yum, 我们可以通过很简单的一条命令完成 gcc 的安装.
指令:sudo yum install 软件名

sudo yum install lrzsz

在这里插入图片描述
yum 会自动找到都有哪些软件包需要下载, 这时候敲 “y” 确认安装.
出现 “complete” 字样, 说明安装完成.
注意事项:

  • 安装软件时由于需要向系统目录中写入内容, 一般需要 sudo 或者切到 root 账户下才能完成。
  • yum安装软件只能一个装完了再装另一个. 正在yum安装一个软件的过程中, 如果再尝试用yum安装另外一个软件, yum会报错。

上面已经安装了lrzsz,下面我们就来说一下lrzsz如何使用。

1.5关于 rzsz(windows 机器和远端的 Linux 机器通过 XShell 传输文件)

这个工具用于 windows 机器和远端的 Linux 机器通过 XShell 传输文件。

将本地的文件上传到 Linux 机器上

方法1:指令: rz - E
通过该指令我们可以将本地的文件上传到云服务器上
在这里插入图片描述
在这里插入图片描述
方法二:可以通过拖拽的方式将文件上传过去。
在这里插入图片描述

将Linux上的文件下载到本地机器的指定文件夹

指令: sz 文件名
该指令可以将云服务器上的文件下载到本地机器的指定文件夹
在这里插入图片描述

1.6如何卸载软件

仍然是一条命令: sudo yum remove 软件名

sudo yum remove lrzsz

输入上述指令后,yum会自动卸载该软件,同样会询问你是否确定卸载(安装),敲y即确认卸载(安装),敲n则表示否,当出现"complete"字样时,表示卸载完成。

二、Linux编辑器-vim使用

  • 在Windows下,我们一般是使用Visual Studio等软件来编写代码、编译代码、以及调试代码的。我们使用的是一个集成开发工具,它可以同时完成编写代码、编译代码以及调试代码的功能。
  • 在Linux下我们一般是通过编辑器(也就是本节要讲的vim)来编写代码,通过编译器(gcc/g++)来编译代码,通过调试器(gdb)来调试代码的

vi/vim的区别:
简单点来说,它们都是多模式编辑器,不同的是vim是vi的升级版本,它不仅兼容vi的所有指令,而且还有一些新的特性在里面。例如语法加亮,可视化操作不仅可以在终端运行,也可以运行于x window、 mac os、windows。

2.1 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.

2.2 vim的基本操作(三种模式的切换)

进入vim,在系统提示符号输入vim及文件名称后,就进入vim全屏幕编辑画面:
指令:vim 文件名

$ vim test.c

不过有一点要特别注意,就是你进入vim之后,是处于[正常模式],你要切换到[插入模式]才能够输入文字。
在这里插入图片描述
[正常模式]切换至[插入模式]

  • 输入a:在当前光标的下一个位置进入插入模式
  • 输入i:在当前光标处进入插入模式
  • 输入o:在当前光标的下一行行首位置进入插入模式

[插入模式]切换至[正常模式]

  • 按一下「ESC」键转到[正常模式]

[正常模式]切换至[末行模式]

  • 「shift + ;」, 其实就是输入「:」

注意:插入模式不能直接切换到底行模式,都要按一下「ESC」经过[正常模式]再切换

退出vim及保存文件,在[正常模式]下,按一下「:」冒号键进入「Last line mode」,例如:

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

2.3 vim正常模式命令集

2.3.1 移动光标

vim可以直接用键盘上的光标来上下左右移动,但正规的vim是用小写英文字母「h」、「j」、「k」、「l」,分别控制光标左、下、上、右移一格

  • 按「G」:移动到文章的最后
  • 按「 $ 」:移动到光标所在行的“行尾”
  • 按「^」:移动到光标所在行的“行首”
  • 按「w」:光标跳到下个字的开头
  • 按「e」:光标跳到下个字的字尾
  • 按「b」:光标回到上个字的开头
  • 按「#l」:光标移到该行的第#个位置,如:5l,56l
  • 按[gg]:进入到文本开始
  • 按[shift+g]:进入文本末端
  • 按「ctrl」+「b」:屏幕往“后”移动一页
  • 按「ctrl」+「f」:屏幕往“前”移动一页
  • 按「ctrl」+「u」:屏幕往“后”移动半页
  • 按「ctrl」+「d」:屏幕往“前”移动半页

2.3.2 删除文字

  • 「x」:每按一次,删除光标所在位置的一个字符
  • 「#x」:例如,「6x」表示删除光标所在位置的“后面(包含自己在内)”6个字符
  • 「X」:大写的X,每按一次,删除光标所在位置的“前面”一个字符
  • 「#X」:例如,「20X」表示删除光标所在位置的“前面”20个字符
  • 「dd」:删除光标所在行
  • 「#dd」:从光标所在行开始删除#行

2.3.3 复制粘贴

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

2.3.4 剪切

  • 「dd」:剪切光标所在行
  • 「#dd」:剪切从光标所在行开始往下的#行
  • 「p」:将已剪切的内容粘贴到光标的下一行
  • 「#p」:将已剪切的内容粘贴#次到光标的下一行

2.3.5 替换

「r」:替换光标所在处的字符。
「R」:替换光标所到之处的字符,直到按下「ESC」键为止。
替换字符串

: s/vivian/sky/ 替换当前行第一个 vivian 为 sky
: s/vivian/sky/g 替换当前行所有 vivian 为 sky
:n, s / v i v i a n / s k y / 替换第 n 行开始到最后一行中每一行的第一个 v i v i a n 为 s k y : n , s/vivian/sky/ 替换第 n 行开始到最后一行中每一行的第一个 vivian 为 sky :n, s/vivian/sky/替换第n行开始到最后一行中每一行的第一个viviansky:n,s/vivian/sky/g 替换第 n 行开始到最后一行中每一行所有 vivian 为 sky
n 为数字,若 n 为 .,表示从当前行开始到最后一行
:%s/vivian/sky/(等同于 :g/vivian/s//sky/) 替换每一行的第一个 vivian 为 sky
:%s/vivian/sky/g(等同于 :g/vivian/s//sky/g) 替换每一行中所有 vivian 为 sky # 常用 要加 % 百分号才是全局

可以使用 # 作为分隔符,此时中间出现的 / 不会作为分隔符
: s#vivian/#sky/# 替换当前行第一个 vivian/ 为 sky/
:%s+/oradata/apras/+/user01/apras1+ (使用+ 来 替换 / ): /oradata/apras/替换成/user01/apras1/

2.3.6 大小写切换

「~」:将光标所在处的字符替换成大写(或者小写)。
「#~」:将光标开始往后的#个字符替换成大写(或者小写)。

2.3.7 撤销上一次操作

「u」:如果您误执行一个命令,可以马上按下「u」,回到上一个操作。按多次“u”可以执行多次回
复。
「ctrl + r」: 撤销的恢复

2.3.8 更改

「cw」:更改光标所在处的字到字尾处
「c#w」:例如,「c3w」表示更改3个字
跳至指定的行
「ctrl」+「g」列出光标所在行的行号。
「#G」:例如,「15G」,表示移动光标至文章的第15行行首。

2.4vim末行模式命令集

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

2.4.1 列出行号

「set nu」: 输入「set nu」后,会在文件中的每一行前面列出行号。

2.4.2 跳到文件中的某一行

「#」:「#」号表示一个数字,在冒号后输入一个数字,再按回车键就会跳到该行了,如输入数字15,再回车,就会跳到文章的第15行。

2.4.3 查找字符

  • 「/关键字」: 先按「/」键,再输入您想寻找的字符,如果第一次找的关键字不是您想要的,可以一直按「n」会往后寻找到您要的关键字为止。
  • 「?关键字」:先按「?」键,再输入您想寻找的字符,如果第一次找的关键字不是您想要的,可以一直按「n」会往前寻找到您要的关键字为止。

注意:/是从左往右,从上往下查找字符,?是从右往左,从下往上查找字符

2.4.4 保存文件

「w」: 在冒号输入字母「w」就可以将文件保存起来

2.4.5 离开vim

「q」:按「q」就是退出,如果无法离开vim,可以在「q」后跟一个「!」强制离开vim。
「wq」:一般建议离开时,搭配「w」一起使用,这样在退出的时候还可以保存文件

2.4.6 分屏指令

  • 「vs 文件名」:实现多文件的编辑
  • 「Ctrl+w+w」:光标在多文件下切换,类似于在windows下Alt+Tab的功能。

2.4.7 执行指令

「!+指令」:在不退出vim的情况下,我们只需要在底行模式下输入!+指令就可以执行当前指令了。

2.5 配置vim

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

  • 设置语法高亮: syntax on
  • 显示行号: set nu
  • 设置缩进的空格数为4: set shiftwidth=4

vim的配置比较复杂建议不要自己一个个去配置,我们可以执行以下指令来配置(想在哪个用户下让vim配置生效, 就在哪个用户下执行这个指令. “不推荐” 直接在 root 下执行)

curl -sLf https://gitee.com/HGtz2222/VimForCpp/raw/master/install.sh -o ./install.sh && bash ./install.sh
按照提示输入 root 密码.
然后等待安装配置,最后手动执行source ~/.bashrc即可
在这里插入图片描述
配置完成后,像自动补全,行号显示以及自动缩进等功能就都有了。
在这里插入图片描述

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

3.1 背景知识

gcc/g++分别是C/C++的编译器。
C和C++编译器的典型编译流程通常包括以下四个主要步骤
1、预处理: 这一步主要是对源代码进行宏替换、头文件展开、条件编译等操作。
2、编译: 在这一步,编译器会把预处理后的源代码转化成汇编语言。编译器在这个过程中会对代码进行语法和语义的分析,如果有错误,就会在这一步报错。
3、汇编: 把编译器生成的汇编代码转换成二进制代码的目标文件。
4、链接: 链接器负责把目标文件和所需的库文件链接起来,生成一个可执行文件。

以上四个步骤在大部分C/C++编译器中是通用的,但具体操作可能因编译器和平台的不同而有所差异。例如,一些高级编译器可能会在编译步骤中加入优化步骤,或者在链接步骤中加入静态和动态链接的区分等。

3.2 gcc/g++的语法选项

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

3.3 gcc生成一个可执行文件流程

格式 gcc [选项] 要编译的文件 [选项] [目标文件]

3.3.1预处理(进行宏替换)

  • 预处理功能主要包括宏定义,文件包含,条件编译,去注释等
  • 预处理指令是以#号开头的代码行。
  • 选项“-E”,该选项的作用是让 gcc 在预处理结束后停止编译过程
  • 选项“-o”是指目标文件,“.i”文件为已经过预处理的C原始程序

实例:

gcc –E hello.c –o hello.i

在这里插入图片描述

在这里插入图片描述

3.3.2编译(生成汇编)

  • 在这个阶段中,gcc首先要检查代码的规范性、是否有语法错误等,以确定代码的实际要做的工作,在检查无误后, gcc把代码翻译成汇编语言。
  • 用户可以使用“-S”选项来进行查看,该选项**只进行编译而不进行汇编,**生成汇编代码。

实例: gcc –S hello.i –o hello.s
在这里插入图片描述
生成汇编代码:
在这里插入图片描述

3.3.3汇编(生成机器可识别代码)

  • 汇编阶段是把编译阶段生成的“.s”文件转成目标文件
  • 读者在此可使用选项“-c”就可看到汇编代码已转化为“.o”的二进制目标代码了

实例: gcc –c hello.s –o hello.o
在这里插入图片描述
汇编代码转化成二进制代码:
在这里插入图片描述

3.3.4链接(生成可执行文件或库文件)

  • 在成功编译之后,就进入了链接阶段。
  • 把目标文件和所需的库文件链接起来,生成一个可执行文件。
  • 如果不用-o选项指定生成文件的文件名,那么默认生成的可执行文件的文件名为a.out

实例: gcc hello.o –o hello
在这里插入图片描述
gcc/g++不带-E、-S、-c选项时,就默认生成预处理、编译、汇编、链接全过程后的文件:
在这里插入图片描述

3.3.5 gcc选项记忆

ESc,iso

3.4 函数库

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

3.4.1 静态库和动态库

函数库一般分为静态库和动态库两种

  • 静态库是指编译链接时,把库文件的代码全部加入到可执行文件中,因此生成的文件比较大,但在运行时也就不再需要库文件了。其后缀名一般为“.a”
  • 动态库与之相反,在编译链接时并没有把库文件的代码加入到可执行文件中,而是在程序执行时由运行时链接文件加载库,这样可以节省系统的开销。动态库一般后缀名为“.so”,如前面所述的libc.so.6 就是动态库。gcc 在编译时默认使用动态库。完成了链接之后,gcc 就可以生成可执行文件,如下所示。 gcc hello.o –o hello

gcc默认生成的二进制程序,是动态链接的,这点可以通过 file 命令验证。
在这里插入图片描述
我们还可以通过ldd指令来查看动态链接的可执行程序所依赖的库。
在这里插入图片描述
虽然说gcc/g++默认生成的二进制程序是动态链接的,但是如果想生成的二进制程序是静态链接的话只需在后面加上-static即可
在这里插入图片描述
这个报错说明我们没有下载gcc/g++静态库,我们通过下面两条指令进行下载:

yum install glibc-static
yum install glibc-static libstdc++-static

运行完再重新生成静态链接的可执行程序:
在这里插入图片描述
下面我们来看看静态链接与动态链接的可执行程序的文件大小:
在这里插入图片描述
我们发现静态链接生成的可执行程序比动态链接生成的可执行程序大了很多。

3.4.2 小结

静态链接:

  • 优点:代码装载速度快,执行速度略比动态链接库快;不依赖第三方库,程序的可移植性好 。
  • 缺点:程序的体积非常大,浪费系统空间

动态链接:

  • 优点:程序体积比较小,比较省系统资源(磁盘和内存)
  • 缺点:速度比静态链接慢;比较依赖动态库,一旦库缺失,所有依赖的程序都不可运行。

四、Linux调试器-gdb使用

4.1 程序的发布方式

程序的发布方式有两种,debug模式和release模式
Linux gcc/g++出来的二进制程序,默认是release模式,是不可调试的,要使用gdb调试,必须在源代码生成二进制程序的时候, 加上 -g 选项,生成debug模式,才可以进行调试
这是因为debug模式下会生成一些调试信息,而release模式下不会。
在这里插入图片描述
我们发现debug模式下的可执行文件明显比release大了很多,这也验证了debug模式下会生成一些调试信息

4.2 gdb命令选项

显示

  • list/l 行号:显示binFile源代码,接着上次的位置往下列,每次列10行。
  • list/l 函数名:列出某个函数的源代码。
  • print/p 表达式:打印表达式的值,通过表达式可以修改变量的值或者调用函数
  • print/p 变量:打印变量的值
  • print/p &变量:打印变量的地址
  • display 变量名:跟踪查看一个变量,每次停下来都显示它的值
  • undisplay 编号:取消对先前设置的那些变量的跟踪

调试

  • r或run:运行程序(开始调试)。
  • n 或 next:逐过程调试(相当于vs调试时的F10)
  • s或step:逐语句调试(相当于vs调试时的F11)
  • set var = x:修改变量var的值为x until X 行号:跳至X行
  • continue(或c):跳到下一个断点处(相当于vs调试时的F5)
  • finish:执行完当前正在调用的函数,然后停下来等待命令(注意不能是主函数)

断点

  • break(b) 行号:在某一行设置断点
  • break 函数名:在某个函数开头设置断点
  • info break :查看断点信息。
  • delete breakpoints:删除所有断点
  • delete breakpoints n:删除编号为n的断点
  • disable breakpoints n:禁用编号为n的断点
  • enable breakpoints n:启用编号为n的断点

退出

  • quit:退出gdb

五、Linux项目自动化构建工具-make/Makefile

5.1 背景

  • 会不会写makefile,从一个侧面说明了一个人是否具备完成大型工程的能力
  • 一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作
  • makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。
  • make是一个命令工具,是一个解释makefile中指令的命令工具,一般来说,大多数的IDE都有这个命令,比如:Delphi的make,Visual C++的nmake,Linux下GNU的make。可见,makefile都成为了一种在工程方面的编译方法。
  • make是一条命令,makefile是一个文件,两个搭配使用,完成项目自动化构建

5.2 为什么要使用make/Makefile?

使用make/Makefile的原因主要有以下几点:

  • 自动化编译:make工具可以根据时间戳自动判断哪些文件需要重新编译,哪些文件不需要重新编译,从而大大提高了编译效率。
  • 模块化管理:利用make工具,可以将大型的开发项目分解成为多个更易于管理的模块,使得项目结构更清晰,维护和更新更加方便。
  • 简化编译过程:Makefile是一个包含编译规则的文件,可以简洁明快地理顺各个源文件之间纷繁复杂的相互关系,避免了每次都需要手动输入gcc命令进行编译的麻烦。
  • 提高开发效率:使用make/Makefile可以大大提高项目开发的效率,因为它们可以自动完成编译工作,并且可以只对程序员在上次编译后修改过的部分进行编译,从而减少了不必要的编译工作。

多文件编译如果不使用make/Makefile进行多文件编译,可能会带来以下缺点:
编译效率低下:对于大型项目而言,如果手动编译每个文件,将浪费大量时间,并可能因为疏忽而漏编译某些文件
容易出现错误:手动编译每个文件可能增加出现编译错误的可能性,尤其是当项目中的文件关系复杂时。
不利于项目管理:手动编译每个文件不利于项目的管理和维护,也不利于代码的模块化和重用。
难以维护:随着项目的不断发展和修改,需要不断地更新每个文件的编译顺序和参数,这会使得编译过程变得复杂且难以维护。
因此,使用make/Makefile可以避免以上问题,提高编译效率,减少错误,便于项目管理,同时也可以使编译过程更加自动化和易于维护。

5.3 依赖关系和依赖方法

使用make/makefile之前我们先来了解一下依赖关系和依赖方法的概念。
依赖关系:
一件事情要有依赖关系才可以做。比如小李和大李,他们俩是父子的关系。所以小李可以叫大李爸爸,大李可以叫小李儿子。
依赖方法:
即然小李和大李是父子关系,所以大李必须履行对小李的抚养义务。大李每个月必须给小李2000块钱的生活费,这就是依赖方法。

在文件当中如何理解依赖关系呢?
比如说一个hello.o文件它是通过hello.c文件经过预处理、编译、汇编等过程得到的,我们就说hello.o文件是依赖于hello.c文件的。也就是说我们知道通过hello.c可以得到hello.c这个文件,那么我们就称hello.c是依赖于hello.o的。

在文件当中如何理解依赖方法呢?
比如说我们的hello.o是依赖hello.c文件的,我们通过gcc -c hello.c-o hello.o指令可以得到hello.o文件,那么我们称hello.o依赖于hello.c的依赖方法就是gcc -c hello.c-o hello.o。也就是说我们知道hello.o是依赖于hello.c的,通过hello.c得到hello.o的这个方法或者指令就称作它的依赖方法

5.4 make/Makefile的使用

  • 首先:创建一个名为Makefile/makefile的文件
    在这里插入图片描述
  • 其次:编写Makefile/makefile文件
    在这里插入图片描述
  • 最后:编写完Makefile之后进入命令模式保存退出,然后在外面执行make指令便可以生成可执行程序。
    在这里插入图片描述
    Makefile文件还有一种简写方式:
  • $@:表示依赖关系中的目标文件(冒号的左侧)
  • $^:表示依赖关系中的依赖文件列表(冒号右侧全部)
  • $<:表示依赖关系中的第一个依赖文件(冒号右侧第一个)
    因此我们可以写成这样:
    在这里插入图片描述
    在这里插入图片描述

注意事项:

  • 依赖关系一定要是正确的,否则依赖方法是不会执行的。
  • 依赖方法前面一定是一个tab键,否则会报错。
    在这里插入图片描述

5.5 make的原理

make是如何工作的,在默认的方式下,也就是我们只输入make命令。那么,

  1. make会在当前目录下找名字叫“Makefile”或“makefile”的文件
  2. 如果找到,它会找文件中的第一个目标文件(target),在上面的例子中,他会找到“hello”这个文件, 并把这个文件作为最终的目标文件。
  3. 如果hello文件不存在,或是hello所依赖的后面的hello.o文件的文件修改时间要比hello这个文件新(可以用 touch 测试),那么,他就会执行后面所定义的命令来生成hello这个文件。
  4. 如果hello所依赖的hello.o文件不存在,那么make会在当前文件中找目标为hello.o文件的依赖性,如果找到则再根据那一个规则生成hello.o文件。(这有点像一个堆栈的过程)
  5. 当然,你的C文件和H文件是存在的啦,于是**make会生成 hello.o 文件,**然后再用 hello.o 文件声明 make的终极任务,也就是执行文件hello了。
  6. 这就是整个make的依赖性,make会一层又一层地去找文件的依赖关系,直到最终编译出第一个目标文件
  7. 在找寻的过程中,如果出现错误,比如最后被依赖的文件找不到,那么make就会直接退出,并报错, 而对于所定义的命令的错误,或是编译不成功,make根本不理。
  8. make只管文件的依赖性,即,如果在我找了依赖关系之后,冒号后面的文件还是不在,那么对不起,我就不工作啦。

5.6 项目清理

  • 工程是需要被清理的,但是每次生成可执行程序都要我们手动去清理的话这样太麻烦了,因此我们可以将项目清理的指令放到Makefile中。

在这里插入图片描述

  • 像clean这种,没有被第一个目标文件直接或间接关联,那么它后面所定义的命令将不会被自动执行,不过,我们可以显示要make执行。即命令——“make
    clean”,以此来清除所有的目标文件,以便重编译。

在这里插入图片描述

  • 但是一般我们这种clean的目标文件,我们将它设置为伪目标,用 .PHONY 修饰,伪目标的特性是,总是被执行的

六、Linux第一个小程序-进度条

行缓冲区:空间中预留了一定的存储空间,这些存储空间用来缓冲输入或输出的数据,这部分预留的空间就叫做行缓冲区。行缓冲区一般是一块系统指定的内存区域。它用在输入输出设备和CPU之间,用来缓存数据。它使得低速的输入输出设备和高速的CPU能够协调工作,避免低速的输入输出设备占用CPU,解放出CPU,使其能够高效率工作。
通过运行两段代码来感受一下缓冲区的存在
在这里插入图片描述
运行结果是:
先休眠3秒,然后打印字符串hello Makefile最后程序运行结束,这个现象也就证明了缓冲区的存在。

下面来看看这段代码:
在这里插入图片描述
运行结果:
先输出字符串hello Makefile然后再休眠3秒程序运行结束。
我们这段代码与上面的代码只是在printf函数最后加了一个’\n’,’\n’ 具有强制刷新的功能,所以运行结果不同。

任何语言的程序再运行的时候,默认都是从上到下依次执行,除非for,函数,if等。第一段代码一定是先执行立printf(字符串被写入到了C程序的缓冲区当中,但并没有被输出!!!),在执行sleep。sleep结束,缓冲区内容被刷新,则才看到字符串的输出。

缓冲区就是一块内存,它有三种刷新策略:
行刷新/程序结束自动刷新/强制刷新。

  • 行刷新——’\n’
  • 强制刷新——fflush(stdout)

\r&&\n

  • \r 是每次冲第一个字符开始打印
  • \n表示换行并刷新

所以我们电脑上的[Enter]按键,其实是\r+\n
进度条代码:

#include <unistd.h>
#include <string.h>
int main()
{
	int i = 0;
	char bar[102];
	memset(bar, 0 ,sizeof(bar));
	const char *lable="|/-\\";
	while(i <= 100 )
	{
		printf("[%-100s][%d%%][%c]\r", bar, i, lable[i%4]);
		fflush(stdout);
		bar[i++] = '#';
		usleep(10000);
	}
	printf("\n");
	return 0;
}

运行结果:
在这里插入图片描述
这里没有用\n,所以使用fflush(stdout);可以强制刷新输出缓冲区,使缓冲区中的内容立即输出。这在需要确保输出立即显示的情况下非常有用,例如在程序调试时,希望立即看到输出结果。

七、使用 git 命令行

安装 git

yum install git

在创建好的项目页面中复制项目的链接, 以备接下来进行下载
在这里插入图片描述
下载项目到本地
创建好一个放置代码的目录.

git clone [url]

6.1三板斧第一招: git add

将代码放到刚才下载好的目录中

git add [文件名]

将需要用 git 管理的文件告知 git

6.2三板斧第二招: git commit

提交改动到本地

git commit .

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

6.3三板斧第三招: git push

同步到远端服务器上

git push

需要填入用户名密码. 同步成功后, 刷新 Github 页面就能看到代码改动了。

配置免密码提交
https://blog.csdn.net/camillezj/article/details/55103149

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值