Linux的基础指令

对目录操作的基础指令

ls:浏览当前目录,查看其内容(在打开一个新的终端时,默认处于当前登录用户的家目录中)。例如在本虚拟机中登录的是test这一用户,此时的操作就是在test目录中进行的。
在这里插入图片描述
ls -l :查看当前目录下文件的详细信息。
在这里插入图片描述
linux下的文件不以后缀名区分,文件夹(目录)也只是个目录类型的文件。
ls -a:查看隐藏文件。(以‘.’为起始的文件),显示所有文件。
在这里插入图片描述
-l和-a也可以组合起来使用:ls -la
在这里插入图片描述
man后加命令可以查看命令的功能,查看完毕后按q退出。
pwd:打印当前工作路径(绝对路径)
/ 表示根目录,即当前工作路径为根目录下的home目录下的test目录

绝对路径:以根目录为起始的路径
相对路径:以当前路径为起始的路径,例如如果在test目录下,则jia表示为jia,若在home目录下,则jia表示为test/jia
在linux中,‘/’表示根目录。linux下的目录结构是唯一的,是一个树形结构。
在这里插入图片描述
linux根目录下各个目录的介绍:
原文链接:https://blog.csdn.net/weixin_40921797/article/details/81664453
bin:
bin是binary的缩写,是UNIX类操作系统中根目录的标准子目录,包含可执行的程序(即准备运行的程序),以便达到启动(即启动)和修复系统的最小功能。
打开 bin目录我们发现。这里面有我们常用的很多命令:cat、mv、cp、su、等。
在这里插入图片描述
所以这里面存放着使用者最经常使用的命令。/bin是系统默认的路径,它是系统发出命令时搜索相应程序的目录列表。这意味着,只要在命令行中输入文件名,然后按下Enter键,就可以运行/bin中的对应的可执行文件(即,可运行程序)从而达到我们执行命令完成对应功能的操作。
boot:
这里面存放的是启动Linux时使用的一些核心文件。该目录包含启动过程所需的所有内容,除了在启动时不需要的配置文件(最明显的是属于grub引导加载程序的那些)和map安装程序。因此,/boot目录存储在内核开始执行用户模式程序之前使用的数据。这可能包括冗余备份(备份)主引导记录、扇区/系统映射文件、内核和其他重要的引导文件和手工不直接编辑的数据。
在这里插入图片描述
dev:
是device(设备)的缩写。是Linux内核的设备管理器。
在这里插入图片描述
作为devfsd和热插拔的继承者,udev主要管理/dev目录中的设备节点。/dev是特殊文件或设备文件的位置。这是一个非常有趣的目录,它突出显示了Linux文件系统的一个重要方面——一切皆文件/目录。看看这个目录,你应该希望看到HDA1,HDA2等…它表示系统的第一个主驱动器上的各个分区。/DEV/CDROM和/DEV/FD0代表您的CD-ROM驱动器和软盘驱动器。这可能看起来很奇怪,但是如果将文件的特性与硬件的特性进行比较,这将是有意义的。两者都可以读取和写入。大多数设备都是块或字符设备,但是存在其他类型的设备,并且可以被创建。通常,“块设备”是存储或保存数据的设备,“字符设备”可以被认为是传输或传输数据的设备。例如,软盘驱动器、硬盘驱动器和CD-ROM驱动器都是块设备,而串行端口、鼠标和并行打印机端口都是字符设备。
etc:
etc目录用来存放系统管理所需要的配置文件和子目录。
在这里插入图片描述

这是我们linux系统的神经中枢,它包含所有与系统相关的配置文件。一个“配置文件”要被定义为用来控制程序操作的本地文件;它必须是静态的,不能是可执行二进制文件。因此,定期备份这个目录是个好主意。如果您重新安装或丢失当前的安装,它肯定会为您节省大量的重新配置时间。通常,不能存放二进制文件。
home:
使用用户的主目录,比如说有个用户叫zhang,那他的主目录就是/home/zhang我们通常用“~”来表示家目录。
lib:
这个目录里存放着内核模块和系统最基本的动态链接共享库,其作用类似于Windows里的.dll文件。几乎所有的应用程序都须要用到这些共享库,是二进制文件。它们对于基本系统功能是必不可少的。
在这里插入图片描述

media:
这是linux中的播放器。Linux媒体播放器和任何其他媒体播放器一样做同样的事情:播放音频和视频。在本文中,“Linux媒体播放器”被用于作为Linux视频播放器和Linux音频播放器的双重任务的软件。
mnt:
系统提供这个目录是让用户临时挂载别的文件系统。这是一个通用的挂载点,您可以在其中挂载文件系统或设备。安装是使系统可用的文件系统的过程。安装后,您的文件将可在挂载点访问。该目录通常包含挂载点或子目录,在其中安装软盘和CD。如果你愿意,你也可以在这里创建额外的挂载点。标准安装点将。包括/MNT/CDROM和/MNT/软盘。在系统上的任何地方创建一个挂载点都没有限制,但按照惯例,纯粹的实用性不会浪费文件系统的挂载点。
opt:
这个目录是为所有不属于默认安装的软件和附加包保留的。因为要遵守FSSTND,所有第三方应用程序都应该安装在这个目录中。在这里安装的任何包都必须找到它的静态文件(如:额外的字体、剪贴板、数据库文件)必须将其静态文件定位在单独的opt的目录树中。
proc:
这个目录是一个虚拟的目录,它是系统内存的映射,我们可以通过直接访问这个目录来获取系统信息。也就是说,这个目录的内容不在硬盘上而是在内存里。通常,它是由系统自动安装的,而且大多数文件是只读的。在Linux下,/proc包含每个运行的进程的目录,包括内核进程。
root:
root包含一个先进的GNU/Linux操作系统。它的目标是稳定、灵活和快速。root是一个通用系统,包括服务器和工作站使用的软件。root包括现代和强大的桌面环境。它是系统管理员的主目录。作为系统的拥有者,它的特权就是单独拥有一个目录。
sbin:
和一开始我们讲的bin类似,s就是super 的意思,/sbin是Linux和其他UNIX类操作系统中root目录的标准子目录,包含可执行程序(即准备运行)程序,也就是说这里存放的是系统管理员使用的管理程序。
srv:
一般是空的,srv包含由该系统服务的站点特定数据。指定这一点的主要目的是使得用户可以找到针对特定服务的数据文件的位置,从而可以合理地放置需要单个树用于只读数据、可写数据和脚本(例如CGI脚本)的服务。只对特定用户感兴趣的数据应该进入用户的主目录。
tmp:
在UNIX和Linux中,tmp目录是存放临时文件的地方。Web浏览器在页面浏览和下载期间定期向TMP目录写入数据。
usr:
usr 不是user的缩写,全拼是Unix System Resources。这是最庞大的目录,我们要用到的应用程序和文件几乎都存放在这个目录下,是用于系统范围的配置文件。
var:
/var是Linux和其他UNIX类操作系统中根目录的标准子目录,它包含系统在其运行过程中写入数据的文件。/var中包含可变数据,如系统日志文件、邮件和打印机假脱机目录,以及临时文件和临时文件。VAR的某些部分在不同系统之间是不可共享的。/var包含变量数据,即系统在运行期间必须能够写入的文件和目录,由于网络拓扑或安全问题,有些目录可以放在单独的分区或系统上,更容易备份。

每一个目录都有两个子目录:. 和 …
. 表示目录本身,即当前目录
… 表示当前目录的上一级目录

mkdir:在当前目录下创建目录
在这里插入图片描述

mkdir-p: 递归多层级创建目录。可以在当前目录的下一层或者下N层创建目录。
在这里插入图片描述
rmdir:删除目录(只能删除空目录)
在这里插入图片描述

rmdir -p:递归多层级删除空目录
在这里插入图片描述
rm:删除文件或目录(默认只能删除文件)
rm -r :删除文件和目录
在这里插入图片描述
-f:忽略提示信息直接操作
-i:显示提示信息
在这里插入图片描述

对文件操作的基础指令:

cp:拷贝一个文件到指定位置
把jia目录下的pass文件拷贝到lei目录下
cp -r:递归拷贝目所有的文件
把jia整个目录都拷贝到了lei目录下
touch:后边加文件名,刷新文件的时间属性,若文件不存在则创建该文件。
文件的时间属性:
最后一次访问时间;
最后一次修改时间;
最后一次状态改变时间。
访问时间和修改时间可以设定为指定值,状态改变时间实时改变。
stat:后边加文件名,显示该文件的时间属性。
在这里插入图片描述
touch -a -d 时间 文件名:修改访问时间
在这里插入图片描述
touch -m -d 时间 文件名:修改修改时间
在这里插入图片描述
touch -c -d 时间 文件名:修改访问和修改时间。
touch -d 时间 文件名:修改访问和修改时间。
在这里插入图片描述
在这里插入图片描述
可以看出状态改变时间会随着每一次修改而改变。
touch -d "时间” 文件名:改变年月日时分秒。(不加双引号则无法改变时分秒,会重新创建一些文件)
在这里插入图片描述

在这里插入图片描述

touch -t 文件名:可以改变文件的所有时间(包括时分秒)。
在这里插入图片描述
cat:打印文件内容(常用于查看短小内容)
more:分页显示文件内容,进入后使用空格向下翻页,回车按行滚动,按q退出
less:分页显示文件内容,进入后F向下翻页,B向上翻页,上下箭头或者J/K按行滚动。‘/’+字符串:向下查找匹配字符串;‘?’+字符串:向上查找匹配字符串,按n继续查找。按q退出。
head:显示文件的前n行内容(默认为10行)
head -n 1 文件名:显示前一行
head 文件名:显示前十行
tail:显示文件末尾的n行内容(默认10行)
tail -n 1 文件名:显示最后一行
tail 文件名:显示后10行
head -n 10 文件| tail -n 1:显示第10行数据
'|'管道符:连接两个命令,将前边命令的处理结果交给后边的命令处理

打包压缩指令:

打包压缩文件:不同算法,压缩比率也不同。
1.zip:
zip test.zip 文件:把文件压缩到test.zip中
unzip test.zip:解压缩
0%是因为pass中没有内容
在这里插入图片描述

压缩完成后得
在这里插入图片描述
把jia目录下的pass删除,对test.zip解压缩,可以重新得到pass
在这里插入图片描述
2.gzip
gzip 文件:生成 文件.gz
gunzip 文件.gz:解压缩
在这里插入图片描述

3.bzip2
bzip2 文件:生成 文件.bz2
bunzip2 文件.bz2:解压缩
在这里插入图片描述
tar打包命令:对多个文件或文件夹打包/解包,并进行压缩/解压缩。
-c 打包;
-x 解包;
-z 打包或解包时按gzip格式压缩/解压缩
-j 打包或解包时按bzip2格式压缩/解压缩
-v 显示详细打包/解包信息
-f 指定包名
打包: tar -czvf 文件名.tar.gz 文件
解包:tar -xvf 文件名.tar.gz
在这里插入图片描述
匹配查找指令:
grep:在指定的文件中匹配包含指定字符串的行
grep -n 字符串 文件:显示字符串的同时会显示行号
grep -n -v 字符串 文件:反向匹配并显示不包含字符串的行
grep -n -i 字符串 文件:忽略大小写进行匹配
grep -R 字符串 目录 在指定的目录中对所有文件逐个进行匹配
字符需要在 之 前 表 示 以 字 符 结 尾 a 之前表示以字符结尾 a a表示以a结尾

字符需要在^之后表示以字符起始 ^a表示以a起始
grep -E ^a try_grep:找到文件try_grep含有以a字母为行开头的内容
在这里插入图片描述
find:在指定的目录中查找符合指定规则的文件
find 目录 -name ’ ':通过文件名查找文件;
find 目录 -name ‘* ’:模糊匹配,只要包含**中间的内容都可以匹配成功文件;
find 目录 -size -100c:(查找匹配小于100c的文件)
find 目录 -size +100c:(查找匹配大于100c的文件)
find 目录 -type f(普通文件):按文件类型查找匹配,f代表普通文件,d代表目录;
按时间查找
find 目录 -amin +3:3分钟以上访问过的文件
find 目录 -amin -3:3分钟以内访问过的文件
find 目录 -atime +3:3天以上访问过的文件
find 目录 -cmin +3:3分钟以上修改过的文件
find 目录 -mmin +3:3分钟以上状态改变过的文件;
find . -name "
.c" -maxdepth 1 | xargs rm 找到当前目录下.c结尾的文件,目录深度为1.(rm *.c也可实现该功能)
xargs是一个强有力的命令,它能够捕获一个命令的输出,然后传递给另外一个命令,用于很多不支持|管道来传递参数的命令

特殊的指令:

man:查看手册
man 命令:查看手册中命令的功能
ifconfig:查看网卡信息
shutdown -h now:关机,仅用于个人
reboot:重启
tab:文件名自动补全(输入文件名的一部分后按tab)
ctrl c:中断当前操作
“>>“:追加重定向 “ls >> test.txt” ,不会清空原有内容
“>”:清空重定向,清空文件中的原有内容再把数据拷贝到文件中。“ls 文件名 > text.txt”,把文件名重定向到test.txt中

权限:

linux将用户分为两类:管理员和普通用户
su 用户名:切换用户
su root:切换管理员权限
sudo 与其他指令搭配使用,表示对当前用户此次操作临时提权(需要用visudo对当前用户提权)
visudo使用方法:
1.进入管理员模式,输入visudo
在这里插入图片描述
在这里插入图片描述

2.找到权限所在行,一般在90行左右,输入 :90
在这里插入图片描述
在这里插入图片描述

3.按i,添加要临时提权的用户,完成后按esc,输入:wq退出。
如下图 jia 即为添加的要临时提权的用户
在这里插入图片描述

对文件的访问权限(什么样的用户能够对文件进行什么样的操作):
对访问用户的分类:文件所有者(u),文件所属组(g),其他用户(o);
对访问操作的分类:可读(r),可写(w),可执行(x);
文件权限的表示方式:rwx rwx rwx 不具备某权限则用-表示,头三个字母表示文件所有者的权限,中间三个表示文件所属组的权限,后三个表示其他用户的权限。
也可用八进制数字表示:111 111 111,不具备则用0表示
在这里插入图片描述
jia开头的d表示该文件为目录类型文件,该文件的文件所有者和文件所属组有读写执行的权限,其他用户则不具备写的权限。
这里有个练习题:
文件权限位为654,所属组成员能对文件进行什么操作?
6:表示文件所有者的权限为110(可读可写不可执行)
5:表示文件所属组的权限为101(可读可执行不可写)
4:表示其他用户的权限为010(只可写)
文件权限的相关指令:
设置文件的默认创建权限:通过文件创建权限掩码进行设置
umask:查看或设置权限掩码,默认在shell文件中文件的默认创建权限为掩码取反或777-umask;umask+数字即可设置。
普通文件默认不具备可执行权限。默认创建普通文件给定权限666(不给予可执行权限)。
在这里插入图片描述
权限为777-002为775,即111 111 101。
umask -S
在这里插入图片描述
修改文件权限:
chmod:针对指定用户添加或删除权限
chmod o-r 文件名:将其他用户对该文件的读权限去掉
chmod a+w 文件名:将所有用户对该文件的写权限加上
chmod 664 文件名:直接指定
特殊权限位:
沾滞位:针对其他用户的一个权限,每个人(其他用户)只能在目录中创建文件或删除自己的文件,不能删除别人的。
chmod +t 文件名:即将该目录设置了沾滞位,在该目录下创建的文件不能被其他用户删除
useradd -m username:添加用户
passwd username 设置密码
即可创建username这个用户(需要root权限)。
在这里插入图片描述
chown:修改文件所有者
chown 用户名 文件名 :将该文件的文件所有者改为用户名
chgrp:修改文件所属组
chgrp 用户名 文件名
如果无法修改一个文件:
1.修改文件所有者为自己
2.修改文件权限(注意自己是哪类用户)

常用工具:软件包管理工具;编辑器;编译器;调试器;项目构建工具;项目管理工具

常用工具有软件包管理工具;编辑器;编译器;调试器;项目构建工具;项目管理工具;
软件包管理工具:
yum:类似于手机的应用商店(管理当前系统中能够安装以及可以卸载的工具,并且可以实现安装卸载操作)
1.查看所能安装的软件工具:
yum list 查看所有工具
在这里插入图片描述

yum search keyword 根据关键字查找指定工具,可以在所有软件包中搜索指定名称的软件包
在这里插入图片描述

2.安装指定的工具:
yum install 工具名
3.卸载已安装的工具:
sudo yum remove 工具名
yum -y update:升级所有包同时也升级软件和系统内核;
yum -y upgrade:只升级所有包,不升级软件和系统内核。
yum 会把下载的软件包和header存储在cache中,而不自动删除。如果觉得占用磁盘空间,可以使用yum clean指令进行清除,更精确的用法是yum clean headers清除header,yum clean packages清除下载的rpm包,yum clean all全部清除。
yum makecache命令的功能是将服务器的软件包信息缓存到本地
编辑器:vim
vim:默认不能使用鼠标,有12种操作模式,最常用的3种:普通,插入,底行。
普通:完成文本的操作以及光标的移动,其他指令的操作
插入:插入数据
底行:更多用于保存退出文件
模式切换:
vim 文件名:打开后默认处于普通模式
普通-》插入:按i,在光标位置插入;按o,在下一行输入(新建一行);按O,在上一行输入。
插入-》普通:按esc
普通-》底行:按:(英文)
底行-》普通:按esc
底行模式下的操作:
:w 保存
:q 退出
:wq 保存并退出
:q! 不保存强制退出(通常打开一个不具备写权限的文件,修改后保存不了,退出不了,只能强制退出)
普通模式下的操作:
光标的移动:
上下左右箭头(hjkl也可实现),ctrl+f 向下翻页,ctrl+b向上翻页,gg到第一行的位置,G到末尾位置。
文本操作:
复制:yy/nyy(复制n行数据,从光标位置开始)
粘贴:p/np
剪切和删除:dd/ndd 删除光标所在行
x 删除光标所在字符
dw 删除单词
其他操作:
u 撤销操作
ctrl+r 反向撤销
gg =G 全文对齐
vim打开一个文件后,通常会创建一个临时文件,以‘.sw*’结尾,vim打开文件后,创建临时文件,编辑的时候会修改这个临时文件,只有在保存的时候才会将修改的信息写入到源文件中。正常退出vim的时候会删除临时文件,并且在文件没有正常关闭退出vim时,这个临时文件不会被删除,这样每次打开源文件的时候都会有这个提示信息。使用ls -a查看隐藏文件,删除掉这个临时文件即可。
vi/vim 中可以使用 :s 命令来替换字符串。该命令有很多种不同细节使用方法,可以实现复杂的功能。就本题而言,实现全部的AAA替换为yyy,也就是全局替换,需要加参数 g。
s/AAA/yyy/g
因此全局替换命令为:s/源字符串/目的字符串/g
编译器:gcc(C语言编译器)/g++(C++编译器)
预处理阶段:展开所有代码
编译阶段:检查语义语法错误,语法分析的结果为分析树parse tree或者语法树syntax tree,编译过程为扫描程序–>语法分析–>语义分析–>源代码优化–>代码生成器–>目标代码优化;
编译优化有
死代码删除:死代码删除是编译最优化技术,指的是移除对程序运行结果没有影响的代码
函数内联:函数内联可以避免函数调用中压栈和退栈的开销
强度削弱:强度削弱是指执行时间较短的指令等价的替代执行时间较长的指令
for循环的循环控制变量通常很适合调度到寄存器访问
汇编阶段:将汇编代码解释成为二进制的CPU指令
链接阶段:将所有指令代码打包到一起,组织成为可执行程序
gcc -E 只进行预处理,生成 .i 文件
gcc -E test.c -o test.i
gcc -S 只进行编译 ,生成 .S 文件
gcc -S test.i -o test.S
gcc - c 只进行汇编 ,生成 .o 文件
gcc -c test.s -o test.o
gcc -o 指定输出文件名称
gcc test.o -o test.exe
gcc常见选项:

-c 汇编完成后停止,不进行链接

-E 预处理完成后停止,不进行编译

-S 编译完成后停止,不进行汇编

-o 用于指定目标文件名称

-g 生成debug程序。向程序中添加调试符号信息
库即函数库,即包含大量函数实现的二进制代码指令的文件。
库的链接方式:
动态链接:链接动态库(libc.so)生成可执行程序,并没有把库中函数的实现指令直接写入可执行程序中,而是在可执行程序中记录了库函数的符号信息表,在运行程序时再加载动态库到内存中。(若动态库不存在,则无法运行程序)gcc中默认的链接方式是动态链接。
动态链接的优点:
生成可执行程序比较小,运行时动态库被加载到内存中,可以多个程序使用同一份内存中的库函数代码;
动态链接的缺点:
运行时需要依赖动态库的存在,不存在则无法运行。
静态链接:链接静态库(libc.a)生成可执行程序,直接将库中的代码指令写入程序中。
静态链接的优点:
程序运行时没有其他依赖,可以直接运行;但是可执行程序比较大,并且如果多个程序使用同一个库中的函数,则这些程序同时运行时,则相同的库函数代码在内存中会存在多份,各是各的。
gdb:调试器
调试器的功能:调试,观察程序的运行过程,通常目的都是为了排查程序的运行错误。
程序错误的分类:编译错误,链接错误,运行时错误(运行中逻辑不对以及程序运行时崩溃)
调试程序的前提:程序必须是一个debug版本的程序;gcc/g++默认生成release版本程序,若要生成debug版本,则使用-g选项
gcc -g test.c -o test
可执行程序的分类:
debug-调试版——不对代码进行优化,并且加入程序调试信息;
release-发布版——不包含调试信息,并且会对代码进行优化。
gdb常用调试指令:gdb ./test.exe
流程控制(简写):
run(r):直接运行程序
start(无):开始逐步调试(从main函数开始)
list(l):查看调试行附近代码 list test.c:12(查看test.c的第12行的代码)
next(n):下一步-逐过程 遇到函数直接运行完毕,不进入函数。
step(s):下一步-逐语句 遇到函数则进入函数继续调试
until(无):直接运行到指定位置 until test.c:16 直接运行到test.c的第16行
continue(c):继续从当前调试位置运行,遇到断点或程序结束停止。逐步调试过程中,不想逐步调试了,想要程序继续向下直接运行的时候用continue
break(b):打断点 break test.c:14 在第14行进行打断;break 函数名 在该函数名位置打断点
info break(ib):查看断点信息
delete(d):删除断点 delete 删除所有断点 ;delete 4;删除第四行的断点
watch:监控断点 watch + 变量名 当变量发生改变的时候停下来
内存操作:
print(p):打印变量内容 print 变量名 ;print 变量名=值即可完成赋值操作
backtrace(bt):查看函数调用栈 通常用于检测程序运行时的崩溃位置,栈顶位置的函数就是程序发生崩溃的位置。
项目自动化构建工具:make/Makefile
Makefile:是一个文本文件,其中记录一个项目的构建规则流程
Makefile的编写规则:
目标对象:依赖对象
tab 为了生成目标对象要执行的命令
vi Makefile
注意gcc前要有tab分隔符
在这里插入图片描述

test为生成的执行程序的名称,test.c为生成程序需要的源码,gcc test.c -o test 执行该操作的指令
目标对象(test):依赖对象(test.c)
tab 为了生成目标对象要执行的命令(gcc test.c -o test)
预定义变量的使用:$ @ $ ^ $ <,都是用于指令中,$ @表示目标对象,$ ^表示所有依赖对象,$ <表示依赖对象的第一个。
Makefile里主要包含了五个东西:显式规则、隐晦规则、变量定义、文件指示和注释。
1、显式规则。显式规则说明了,如何生成一个或多的的目标文件。这是由Makefile的书写者明显指出,要生成的文件,文件的依赖文件,生成的命令。
2、隐晦规则。由于我们的make有自动推导的功能,所以隐晦的规则可以让我们比较粗糙地简略地书写Makefile,这是由make所支持的。
3、变量的定义。在Makefile中我们要定义一系列的变量,变量一般都是字符串,这个有点你C语言中的宏,当Makefile被执行时,其中的变量都会被扩展到相应的引用位置上。
4、文件指示。其包括了三个部分,一个是在一个Makefile中引用另一个Makefile,就像C语言中的include一样;另一个是指根据某些情况指定Makefile中的有效部分,就像C语言中的预编译#if一样;还有就是定义一个多行的命令。有关这一部分的内容,我会在后续的部分中讲述。
5、注释。Makefile中只有行注释,和UNIX的Shell脚本一样,其注释是用“#”字符,这个就像C/C++中的“//”一样。如果你要在你的Makefile中使用“#”字符,可以用反斜框进行转义,如:“#”。
最后,还值得一提的是,在Makefile中的命令,必须要以[Tab]键开始。
默认的情况下,make命令会在当前目录下按顺序找寻文件名为“GNUmakefile”、“makefile”、“Makefile”的文件,找到了解释这个文件。在这三个文件名中,最好使用“Makefile”这个文件名,因为,这个文件名第一个字符为大写,这样有一种显目的感觉。最好不要用“GNUmakefile”,这个文件是GNU的make识别的。有另外一些make只对全小写的“makefile”文件名敏感,但是基本上来说,大多数的make都支持“makefile”和“Makefile”这两种默认文件名。
在Makefile使用include关键字可以把别的Makefile包含进来,这很像C语言的#include,被包含的文件会原模原样的放在当前文件的包含位置。include的语法是:

include <filename>;

filename可以是当前操作系统Shell的文件模式(可以保含路径和通配符)

原文链接:https://blog.csdn.net/u013370834/article/details/53002756
程序的编译过程:预处理,编译,汇编,链接 – 在项目构建中会整体分为两步:编译与链接。这样的好处是:如果只修改了一个.c文件,那么以前直接对所有.c进行编译生成可执行程序的过程来说,需要重新编译所有.c生成可执行程序,效率低下。因此分为两步进行操作,先把每个.c都生成自己的.o,然后再把所有的.o链接到一起,这样一旦一个.c发生改变,只需要对该.c重新进行编译生成.o之后重新链接程序中的指定.o模块即可,重新的.c不需要重新编译。
make:是一个解释程序,对Makefile中记录的构建规则流程逐步解释执行,完成项目的构建
make的解释执行规则:
1.在命令行中敲击make指令,则表示运行make解释程序,程序会在当前目录下找到名称为makefile/Makefile的文件,解释执行其中的项目构建规则
2.在规则中,找到第一个要生成的目标对象(判断目标对象是否已经存在,存在的话是否需要重新生成–根据原码文件的最后一次修改时间对比),然后执行对象生成这一指令。
3.make每次在makefile中只会找到第一个目标对象进行生成,生成之后就会退出,也就是说不会生成第二个对象。
4.make在生成目标对象的时候,会先查找依赖对象的生成规则,先生成依赖对象,然后再生成目标对象。
在这里插入图片描述
在这里插入图片描述
$(wildcard ./*.c) :获取当前目录下所有以.c结尾的文件的文件名称
在这里插入图片描述
在这里插入图片描述

%通配符:表示把任意名称的.c文件都生成他自己的.o
在这里插入图片描述
在这里插入图片描述
make clean:清理
'.PHONY: ':伪对象,声明一个目标对象与外部文件无关,表示每次这个对象不管是否最新都要重新生成。例如上面的清理命令,如果目录下没有clean,则始终执行,不过一旦有了clean文件,则不会执行rm指令了。
.PHONY:clean 的作用是无视clean文件是否存在。
在这里插入图片描述
git:项目的版本管理工具
功能:整理归档项目周期的各个阶段,便于项目的管理。
git三板斧操作:
1.在github建立远程仓库
2.将远程仓库克隆到本地:git clone 网址
3.提交本次修改记录:git add --all ./
4.提交本地仓库版本管理:git commit -m“本次修改的备注信息”
5.将本地版本同步到远程仓库:git push origin master (master是主分支)
进度条程序:
数据先被写入缓冲区(一块内存空间),缓冲区数据满了,或者要退出程序了,或者手动刷新缓冲区了,这时候数据才会被写入实际文件。每个文件都会有自己的缓冲区,标准输入文件的缓冲区有个特性:换行刷新缓冲区,刷新缓冲区就是把缓冲区的数据写入文件。
/r:回车符—光标移动到起始位置
/n:换行符—光标移动到下一行
进入test.c文件编辑
在这里插入图片描述

编写程序
在这里插入图片描述
进入makefile生成目标对象
在这里插入图片描述
因为默认标准为C89,编译C99程序需加参数“–std=c99”
在这里插入图片描述
make执行makefile中的指令生成test
在这里插入图片描述
实现编写程序的功能
在这里插入图片描述

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值