1:Linux软件包管理器apt
- apt是一个软件下载安装管理的一个客户端(类比小米应用商店,华为应用商城).
- Linux中的软件包可能会存在依赖关系---->apt会帮助解决依赖关系的问题.
1.1:软件包的概念
- 在Linux下安装软件,有三种方式:(1):下载程序的源代码,进行编译,得到可执行程序.(2):rpm安装.(3):apt安装
- 但是下载程序的源代码太麻烦了,因此有些人将一些常用的软件提前编译好,做成软件包(可以理解成Windows上的安装程序)放在一个服务器上,通过包管理器去获取这个编译好的软件包,直接进行安装.
- 软件包和软件包管理器,就好比"App"和"应用商店"这样的关系.
1.2:Linux系统的生态
1.3:apt相关操作
1.3.1:apt下载
1.3.2:apt删除
、
1.4:apt更新软件包
这两个指令我们在配置软件源文件的时候使用到过,需要root或者sudo。
指令:apt update:从软件仓库中更新软件包列表,确保获取到最新的软件包信息。
指令:apt upgrade:升级所有可升级的软件包到最新版本。
2:Linux编译器--vim的使用
vi/vim 的区别简单点来说,它们都是多模式编辑器,不同的是 vim 是 vi 的升级版本,它不仅兼容 vi 的所有指令,而且还有一些新的特性在里面。例如语法加亮,可视化操作不仅可以在终端运行,也可以运行于x window 、 mac os、 windows
2.1:vim的基本概念
vim的模式有很多种,但我们最主要只要掌握三种即可,分别是命令模式(command mode)、插入模式(Insert mode)和底行模式(last line mode).
控制屏幕光标的移动,字符,字与行的删除,移动复制某区段以及进入插入模式或者到底行模式.
只有在该模式下,才能够进行文字输入,按[ESC]键可以回到命令模式.
文件的保存与退出,也可以进行文件替换,找字符串,列出行号等操作.在命令模式下,shift + : 即可进入该模式.
2.2:命令模式下的快捷键
- n + yy ------>连续复制n行
- n + p:粘贴到当前光标的下一行 n:表示将指定的内容粘贴n次
- u: 撤销
- ctrl + r:对历史撤销进行撤销
- n + dd:剪切/删除指定行(连续的多行).
- shift + 4:将光标定位到当前行的结尾.
- shift + 6:将光标定位到当前行的开头.
- gg:将光标定位到整个文本的最开头.
- shift + g:将光标定位到整个文本的最后一行.
- n + shift + g:将光标定位到整个文本的任意一行.
- w:以单词为单位进行光标后移.
- b:以单词为单位进行光标前移.
- shift + ~:大小写切换
- n + x:删除光标后续的一个字符,可以一次删除n个(一行内)
- n + shift + x:删除光标之前的一个字符,可一次删除n个(一行内)
- n + r:对光标指定的位置,进行一个字符的替换,可以一次替换多个
- shift + r:进入替换模式,直接进行文本替换.
- shift + zz:保存并退出.
2.3:底行模式下的快捷键
- w:保存.
- q:退出.
- wq:保存并退出.
- !:强制.
- set nu / nonu:打开行号/去掉行号.
- /关键字:对文本内容进行搜索.
- !command:不退出vim的前提下进行shell命令的执行(常用与函数查看)
- vs filename(分屏,多文件操作)
- ctrl + ww:将光标进行屏幕的切换
2.4:vim中的批量化注释与批量化去注释
- 在命令模式下,ctrl + v-------->hjkl进行区域选择--->shift + i(进行插入模式)---> //(进行注释)---->esc * 2;
- 在命令模式下,ctrl + v-------->hjkl进行区域选择--->包含仅包含//---->d(进行删除);
3:Linux编译器---gcc/g++的使用
gcc和g++分别是GNU的C和C++的编译器,gcc和g++在执行编译的时候一般有以下四个步骤:
- 预处理(头文件展开、去注释、宏替换、条件编译)。
- 编译(C代码翻译成汇编语言)。
- 汇编(汇编代码转为二进制目标代码)。
- 链接(将汇编过程产生的二进制代码进行链接)。
3.1预处理
- 预处理功能的主要包括宏替换,去注释,头文件展开,条件编译.
- 预处理指令是以#号开头的代码行.
-E:是告诉编译器,从现在开始进行程序的编译,预处理完成,就停下来.
3.2:编译(生成汇编)
在这个阶段,gcc首先检查代码的规范性,是否有语法错误等,以确定代码的实际要做的工作,在检查无误后,gcc将代码编译成汇编语言.
-S:从现在开始进行程序的编译,编译完成并生成汇编代码就停下来.
3.3:汇编
汇编阶段是将编译阶段生成的.s文件转成目标文件.
-c:从现在开始进行程序的汇编,汇编完成就停下来!
3.4:链接
- 链接阶段就是生成可执行文件与库文件.
- 编译完成后则进行链接.
3.5:gcc选项
- -E 只激活预处理,这个不生成文件,你需要把它重定向到一个输出文件里面
- -S 编译到汇编语言不进行汇编和链接
- -c 编译到目标代码
- -o 文件输出到 文件
- -static 此选项对生成的文件采用静态链接
- -g 生成调试信息。GNU 调试器可利用该信息。
- -shared 此选项将尽量使用动态库,所以生成文件比较小,但是需要系统由动态库.
- -O0 -O1 -O2 -O3 编译器的优化选项的4个级别,-O0表示没有优化,-O1为缺省值,-O3优化级别最高。
- -w 不生成任何警告信息。
- -Wall 生成所有警告信息。
4:链接详解
4.1:函数库
- 我们的C程序中,并没有定义“printf”的函数实现,且在预编译中包含的“stdio.h”中也只有该函数的声明,而没有定义函数的实现,那么,是在哪里实“printf”函数的呢?
- 答案是:系统把这些函数实现都被做到名为 libc.so.6 的库文件中去了,在没有特别指定时,gcc 会到系统默认的搜索路径“/usr/lib”下进行查找,也就是链接到 libc.so.6 库函数中去,这样就能实现函数“printf”了,而这也就是链接的作用
4.2:动态库与静态库
- 静态库指的是在编译链接时,把库文件的代码全部加入到可执行文件当中去,因此生成的文件比较大,但在运行时也就不再需要库文件了.其后缀名一般为".a"
- 动态库则与静态库相反,在编译链接时没有把库文件的代码加入到可执行文件中,而是在程序执行时由运行时链接文件加载库,这样子可以节约系统的开销.动态库的后缀名一般为.so
4.3:动态链接与静态链接
- 动态链接:告知目标库的地址,然后去进行链接,动态链接是共享动态库的,但是一旦动态库缺失,所有的动态链接这个库里的程序,就都无法执行了.
- 静态链接:在编译的时候,将库中的方法,拷贝到自己的可执行程序当中(不在关心任何库).
- gcc默认形成的可执行程序,默认采用动态链接.默认情况下,Linux上,一般静态库是没有安装的.
动态链接:
- 优点:省空间(磁盘的空间,内存的空间),bin体积小,加载速度快。
- 缺点:依赖动态库,程序可移植性较差。
静态链接
- 优点:不依赖第三方库,程序的可移植性较高。
- 缺点:浪费空间。
5:Linux调试工具----gdb
5.1:list/l: list 文件名:行号 或者 list 行号 /函数.
5.2:b 文件名:行号/函数名 或者 b 行号/函数名.
- info b:检查所打的断点信息
- d 断点编号:函数断点
5.3:diable /enable 断点编号(关闭/打开断点)
5.4:r:运行程序 next/n:逐过程(不进入函数内部) setp/s(逐语句执行)
5.5:print /p 变量名:查看变量的内容 continue/c:运行到下一个断点处
5.6:display 变量名 undisplay 编号
5.7:until 行号
5.8:finish
5.9:set var 变量名
6:Linu项目自动化构建工具-make/Makefile
6.1:背景知识
- 一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的 则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂 的功能操作.
- makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。
- make是一个命令工具,是一个解释makefile中指令的命令工具,一般来说,大多数的IDE都有这个命 令,比如:Delphi的make,Visual C++的nmake,Linux下GNU的make。可见,makefile都成为了一 种在工程方面的编译方法.
- make是一条命令,makefile是一个文件,两个搭配使用,完成项目自动化构建.
6.2:依赖关系与依赖方法
6.3:make的原理
- make是如何工作的,在默认的方式下,我们输入make命令,那么
- make会在当前目录下找名字叫"Makefile"或者"makefile"的文件.根据makefile的内容完成编译/清理工作
- 2.makefile会对最新的可执行程序,默认不想重新生成----->提高编译效率
- 3.makefile会对比可执行文件与源文件最近的修改时间,谁更新.
- 4.make的依赖性,make会一层又一层地去找文件的依赖关系,直到最终编译出第一个目标文件.
在命令前面加了@符号后,此时再进行Make不会输出命令
makefile里的依赖方法可以跟多条命令
总结一下那就是
- 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只管文件的依赖性,即,如果在我找了依赖关系之后,冒号后面的文件还是不在,那么对不起, 我就不工作啦。
6.4:项目清理
- 工程是需要被清理的
- 像clean这种,没有被第一个目标文件直接或间接关联,那么它后面所定义的命令将不会被自动执行,不过,我们可以显示要make执行。即命令——“make clean”,以此来清除所有的目标文件,以便重编译。
- 但是一般我们这种clean的目标文件,我们将它设置为伪目标,用 .PHONY 修饰,伪目标的特性是,总是被执行的。
好啦,家人们,关于Linux环境基础开发实现这块的相关细节知识,博主就讲到这里了