点击全文阅读
目录
1.Linux软件包管理 -- yum1.查看软件包2.如何安装软件3.如何卸载软件 2.Linux编辑器 -- vim1.vim的基本概念2.vim的基本操作3.vim正常模式命令集4.vim底行模式命令集5.进阶补充 3.Linux编译器 -- gcc/g++1.预处理2.编译--(C -> 汇编)3.汇编--(汇编 -> 可重定向二进制目标文件)4.链接--(链接多个.o/.obj -> 合并形成一个可执行)5.函数库6.函数库 --> 静态库&动态库7.gcc选项8.gcc选项记忆9.进阶补充 4.Linux调试器 -- gdb0. 前期提要1.使用 5.Linux项目自动化构建工具 -- make/Makefile0.前情提要1.依赖关系2.依赖方法3.原理4.项目清理5..PHONY理解6.进阶补充 6.git命令行
本篇文章以Centos为例
1.Linux软件包管理 – yum
1.查看软件包
通过
yum list命令可以罗列出当前一共有哪些软件包,由于包的数目可能非常之多, 使用
grep命令只筛选出我们关注的包
yum list | grep sl
注意事项: 软件包名称: 主版本号.次版本号.源程序发行号-软件包的发行号.主机平台.cpu架构“x86_64” 后缀表示64位系统的安装包, “i686” 后缀表示32位系统安装包. 选择包时要和系统匹配“el7” 表示操作系统发行版的版本. “el7” 表示的是 centos7/redhat7. “el6” 表示 centos6/redhat6最后一列, base 表示的是 “软件源” 的名称, 类似于 “小米应用商店”, “华为应用商店” 这样的概念
2.如何安装软件
sudo yum install sl
yum会自动找到都有哪些软件包需要下载
注意事项: 安装软件时由于需要向系统目录中写入内容,一般需要sudo或者切到root账户下才能完成yum安装软件只能一个装完了再装另一个 yum正在安装一个软件的过程中,如果再尝试用yum安装另外一个软件,yum会报错
3.如何卸载软件
yum remove sl
2.Linux编辑器 – vim
1.vim的基本概念
主要掌握三种模式:是命令模式、插入模式、和底行模式
正常/普通/命令模式(Normal mode) 控制屏幕光标的移动,字符、字或行的删除,移动复制某区段及进入Insert mode下,或者到last line mode
插入模式(Insert mode) 只有在Insert mode下,才可以做文字输入,按「ESC」键可回到命令行模式。该模式是我们后面用的最频繁的编辑模式
底行模式(last line mode) 文件保存或退出,也可以进行文件替换,找字符串,列出行号等操作在命令模式下,shift+: 即可进入该模式要查看所有模式:底行模式直接输入:help vim-modes
2.vim的基本操作
[正常模式]切换至[插入模式] 按「a」进入插入模式后,是从目前光标所在位置的下一个位置开始输入文字按「i」进入插入模式后,是从光标当前位置开始输入文字按「o」进入插入模式后,是插入新的一行,从行首开始输入文字
[插入模式]切换至[正常模式] 按一下「ESC」键转到[正常模式]
[正常模式]切换至[底行模式] 「shift + ;」, 其实就是输入「:」
退出vim及保存文件 在[正常模式]下,按一下「:」冒号键进入「底行模式」
: w(保存当前文件)
:wq(存盘并退出vim)
:q!(不存盘,强制退出vim)
3.vim正常模式命令集
移动光标 「h」「j」「k」「i」 | 左、下、上、右 | | |
---|
「G」 | 进入文本末端 | n+「G」 | 定位到文件的任意行 |
「gg」 | 进入文本开始 | | |
「^」 | 移动光标到当前行"行首" | | |
「$」 | 移动光标到当前行"行尾" | | |
「w」/「b」 | 以单词为单位进行光标前后移动 | | |
「#l」 | 光标移动到当前行的第#个位置 | | |
「Ctrl」+「f」/「b」 | 屏幕往"下"/"上"移动一页 | | |
「Ctrl」+「d」/「u」 | 屏幕往"下"/"上"移动半页 | | |
删除文字 「x」 | 每按一次,删除光标所在位置的一个字符 | n +「x」 | 删除光标及后面的n个字符 |
---|
「X」 | 每按一次,删除光标所在位置前面的一个字符 | n +「X」 | 删除光标前面的n个字符 |
「dd」 | 剪切(删除)光标所在行 | n +「dd」 | 从光标所在行开始剪切(删除)n行 |
复制 「yw」 | 将光标所在之处到字尾的字符复制到缓冲区中 | n+****「yw」 | 复制n个字到缓冲区 |
---|
「yy」 | 复制光标所在行到缓冲区 | n+****「yy」 | 复制从当前行开始,往下n行 |
「p」 | 将缓冲区内的字符粘贴到光标所在位置 | | |
替换 「r」 | 替换光标所在处的字符 | n+「r」 | 替换光标处及后面的n个字符 |
---|
「R」 | 进入替换模式 | | |
「~」 | 大小写切换 | | |
更改 「cw」 | 更改光标所在处的字到字尾处 |
---|
「c#w」 | 更改#个字 |
撤销 4.vim底行模式命令集
「set nu」 | 列出行号 | |
---|
「#」 | 跳到文件中的某一行 | **#**表示一个数字 |
「!cmd」 | 不退出vim执行对应的命令 | |
「vs filename」 | 分屏模式 | |
查找字符: /向下找,?向上找**
「/关键字」 | 如果第一次找的关键字不是想要的,可以一直按 「n」会往后寻找到要的关键字为止 |
---|
「?关键字」 | 如果第一次找的关键字不是想要的,可以一直 按「n」会往前寻找到要的关键字为止 |
5.进阶补充
批量注释 Ctrl + V选中输入A输入//esc 批量替换 底行模式下%s/要被替换的内容/替换的内容/gg表示全局替换 VS下,多文件切换:CTRL +H/J/K/L
3.Linux编译器 – gcc/g++
**语法:**gcc [选项] 要编译的文件 [选项] [目标文件]
1.预处理
预处理功能主要包括宏定义,文件包含,条件编译,去注释等预处理指令是以#号开头的代码行选项**“-E”
,该选项的作用是让gcc在预处理结束后停止编译过程**选项"
-o"是指目标文件,“
.i”文件为已经过预处理的C原始程序
gcc –E hello.c –o hello.i
2.编译–(C -> 汇编)
在这个阶段中,gcc首先要检查代码的规范性、是否有语法错误等,以确定代码的实际要做的工作,在检查无误后,gcc把代码翻译成汇编语言选项"
-S",该选项的作用是让gcc
在编译结束后就停止,不进行汇编gcc –S hello.i –o hello.s
3.汇编–(汇编 -> 可重定向二进制目标文件)
汇编阶段是把编译阶段生成的"
.s"文件转成目标文件在此可使用选项"
-c“就可将汇编代码转化为”
.o"的二进制目标代码
gcc –c hello.s –o hello.o
4.链接–(链接多个.o/.obj -> 合并形成一个可执行)
在成功编译之后,就进入了链接阶段一般链接过程,是有两种方式的 动态链接:需要动态库
– 将库中要的方法的地址,填入可执行程序中,建立关联
– 节省资源静态链接:需要静态库
– 将库中方法的实现,真的拷贝到我们的可执行程序中
– 占用资源
gcc hello.o –o hello
5.函数库
我们的C程序中,并没有定义"printf"的函数实现,且在预编译中包含的"stdio.h"中也只有该函数的声明,而没有定义函数的实现,那么,是在哪里实"printf"函数的呢? 系统把这些函数实现都做到名为libc.so.6的库文件中去了,在没有特别指定时,gcc会到系统默认的搜索路径"/usr/lib"下进行查找,也就是链接到libc.so.6库函数中去,这样就能实现函数"printf"了,而这也就是
链接的作用 6.函数库 --> 静态库&动态库
静态库: 指编译链接时,
把库文件的代码全部加入到可执行文件中,因此
生成的文件比较大,但在运行时也就不再需要库文件了其后缀名一般为"
.a"
动态库: 与之相反,在编译链接时
并没有把库文件的代码加入到可执行文件中,而是
在程序执行时由运行时链接文件加载库,这样
可以节省系统的开销动态库一般后缀名为"
.so"gcc在编译时,
默认使用动态库,完成了链接之后,gcc就可以生成可执行文件 gcc默认生成的二进制程序,是动态链接的,这点可以通过
file命令验证
7.gcc选项
-E | 只激活预处理,这个不生成文件,你需要把它重定向到一个输出文件里面 |
---|
-S | 编译到汇编语言不进行汇编和链接 |
-c | 编译到目标代码 |
-o | 文件 输出到 文件 |
-static | 此选项对生成的文件采用静态链接 |
-g | 生成调试信息 – GNU 调试器可利用该信息 |
-shared | 此选项将尽量使用动态库,所以生成文件比较小,但是需要系统由动态库 |
-O0 | -O0****表示没有优化 |
-O1 | -O1****为缺省值 |
-O2 | |
-O3 | 编译器的优化选项的4个级别,-O3优化级别最高 |
-w | 不生成任何警告信息 |
-Wall | 生成所有警告信息 |
8.gcc选项记忆
翻译三部曲:
Esc生成文件三部曲:
iso 9.进阶补充
-D --> 用于定义预处理宏,它的作用是再编译时为源代码中定义一个符号常量
语法:-Dname=valuename代表宏的名称,
value是宏的值
4.Linux调试器 – gdb
0. 前期提要
程序的发布方式有两种,debug模式和release模式Linux gcc/g++出来的二进制程序,默认是release模式要使用gdb调试,必须在源代码生成二进制程序的时候, 加上
-g 选项
1.使用
gdb会记录最近一条命令,如果命令无变化,可以直接回车,则直接调用上一条命令
quit | 退出gdb | |
---|
l+行号 | 显示源码,接着上次的位置往下列,每次列10行 | list |
l+函数名 | 列出某个函数的源码 | |
r | 开始调试,如果没有设置断点,就直接运行结束 | run |
b+行号 | 给特定的行号打断点 | break |
b+函数名 | 给特定的函数开头打断点 | |
info b | 查看断点(断点的编号) | info break |
d 断点编号 | 删除断点 | delete |
d breakpoints | 删除所有断点 | |
n | 逐过程 --> F10 | next |
s | 逐语句 --> F11 | step |
c | 运行至下一个断点处停下来 | continue |
finish | 将当前函数跑完,就停下来 | |
p 变量名 | 打印变量内容 | print |
set var | 修改变量的值 | |
bt | 查看当前的调用堆栈 | breaktrace |
display | 设置长显示,类似于VS的监视窗口 | |
undisplay | 取消长显示 | |
until 行号 | 跳转到指定行 | |
disable/enable 断点的编号 | 使能(打开和关闭)断点 | |
5.Linux项目自动化构建工具 – make/Makefile
0.前情提要
会不会写makefile,从一个侧面说明了一个人是否具备完成大型工程的能力一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作makefile带来的好处就是 – “
自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率make是一个命令工具,是一个解释makefile中指令的命令工具
make****是一条命令,
makefile是一个文件,两个搭配使用,完成项目自动化构建
1.依赖关系
上面的mytest,它依赖hello.cpp下面的mytest,它依赖hello.o,test.o test.o,它依赖test.cpphello.o,它依赖hello.cpp
2.依赖方法
依赖关系与之对应的依赖方法
g++ hello.cpp -o mytestg++ hello.o test.o -o mytest g++ -c test.cpp -o test.o g++ -c hello.cpp -o hello.o
3.原理
make会在当前目录下找名字叫**"Makefile"或"makefile"的文件**如果找到,它会找文件中的第一个目标文件(target),在上面的例子中,他会找到"mytest"这个文件, 并把这个文件作为最终的目标文件如果mytest文件不存在,或是mytest所依赖的后面的**.o**文件的文件修改时间要比mytest这个文件新(可以用touch测试),那么,他就会执行后面所定义的命令来生成mytest这个文件如果mytest所依赖的**.o
文件不存在,那么make会在当前文件中找目标为.o
文件的依赖性,如果找到则再根据那一个规则生成.o**文件(这有点像一个堆栈的过程)这就是整个make的依赖性,make会一层又一层地去找文件的依赖关系,直到最终编译出第一个目标文件在找寻的过程中,如果出现错误 比如最后被依赖的文件找不到,那么make就会直接退出,并报错而对于所定义的命令的错误,或是编译不成功,make根本不理 make只管文件的依赖性 即:如果在我找了依赖关系之后,冒号后面的文件还是不在,那么对不起, 我就不工作啦
4.项目清理
工程是需要被清理的像clean这种,没有被第一个目标文件直接或间接关联,那么它后面所定义的命令将不会被自动执行, 不过,可以显式让make执行即命令 – “
make clean”,以此来清除所有的目标文件,以便重编译但是一般我们这种clean的目标文件,我们将它设置为
伪目标,用**.PHONY**修饰
伪目标的特性:总是被执行的 5…PHONY理解
.PHONY是一个特殊的目标,用于指示"make"哪些目标不代表实际的文件或目录,而是伪目标或动作通常,
.PHONY用于列出那些不生成文件,只是执行一些命令或操作的目标
6.进阶补充
$@ | 依赖方法对应的依赖关系的目标文件 |
---|
$^ | 冒号右侧的所有文件 |
如何一次性编译多个文件?
.PHONY:allall: exec mycmd
6.git命令行
git免密码提交可以参考下面大佬的文章~配置免密码提交
点击全文阅读