软件之间是相互相互依赖的
在日常使用时,我们经常会遇见缺失某个.dll文件的情况,这就是相互依赖的软件之间的缺失导致的无法使用。因此,软件之间是相互依赖的。
如何在Linux中安装软件:
- 源码安装 ×
- 软件包安装 ------
rpm× - 包管理器
yum(centos) apt/apt-get(ubuntu)(可以自动为我们解决包的依赖问题)
和Windows一样,Linux中安装软件也是需要网络下载的。但是和Windows不太一样的是:Linux下安装必须使用root权限,是安装到系统中的。只要安装因此,任何人都可以使用。
几个相关的问题?
那么什么是包管理器呢?用简单一点的话来说就类似于手机上的应用商店。
Linux上的软件是谁提供的呢?Linux 上的软件主要由发行版官方团队、第三方商业公司(如 Google、微软)、开源社区开发者 以及容器仓库(如 Snap、Flatpak) 提供。
如何评估一款操作系统的好坏?内核版本,生态(社区、文档、人群、问题...)
yum
sudo yum -y install sl:安装sl(-y就是不需要再次询问
ping -c3 www.baidu.com :连接百度,可以用这条指令确认是否联网
sudo yum remove -y sl:卸载sl
/etc/yum.repos.d/* :(yum源配置文件)
centos中更改 yum源:网络上教程非常多,不多赘述
yum clean all:清理yum源缓存
vim的使用
vim是什么?是一款多模式的编译器。
分为下面三种模式:
- 命令模式:默认,输入
i/a/o进入插入模式,输入:进入底行模式 - 底行模式:
esc回到命令模式,wq退出,set nu显示行号,set nonu去掉行号 - 插入模式:按
esc回退回命令模式
我们无法直接直接从插入模式转化到底行模式,一定需要通过命令模式中转 。
下面我们简单介绍一下命令模式和底行模式:
命令模式
gg:快速回归光标到开头
G:快速回到结尾;n+G:定位到第 n 行
$:直接定位到这行最结尾,^:直接定位到最结尾、
h:左移,j:下移,k:上移,l:右移
n+yy:批量复制,n+p:粘贴,n+dd:批量剪切
u:撤销历史操作,ctrl+r:撤销撤销操作
n+w:以单词为单位向右移动,n+b:以单词为单位向左移动
x:删除光标所在位置字符,X:光标右侧不动,左侧删除
n+r+对应字符:替换光标所在字符的后面n个成对应字符
R:批量化替换
~:大小写快速切换
ctrl+v:释符模式,hjkl区域选择,I(shift+i):进入插入模式
//+esc:既回到命令模式,同时批量注释刚才选中的区域,选中后也可以d:快速删除选中内容
#:选中单词,n:逆向查找
| 标志 | 作用 |
|---|---|
g |
全局替换(每行所有匹配) |
c |
替换前确认(confirm) |
i |
忽略大小写 |
n |
只计数,不实际替换 |
底行模式
w保存,q退出,wq保存并退出
!command:在不退出vim的情况下执行命令
%s/dst/src/ :用src批量化替换dst
vs x:分屏操作,右边打开x文件
ctrl+ww:切换到另一个终端
使用vim的小技巧:vim code.c n:打开时定位到第n行
!(l)对应命令:自动运行最近的以 l 开头的命令
Linux编译器 - gcc/g++的使用
简单介绍完vim之后,我们再来看一下如何在Linux上跑C/C++文件呢?
(关于下载这里就不多介绍,大家可以查看自己的Linux版本号后问一下AI即可)
gcc code.c -o mycode:将code.c文件编译成mycode的可执行程序
gcc -o mycode.exe code.c:和上面一致,后面可以加多个源文件
gcc -E code.c -o code.i:-E代表从现在开始进行程序翻译,在预处理(头文件展开,宏替换)做完就停下来,将预处理结束后的文件保存在新建code.i文件
gcc -S code.i -o code.s:将预处理结果生成汇编语言,把编译做完就停下来
gcc -c code.s -o code.o:(.o文件叫做可重定位目标文件,已经是二进制的了)-C代表程序开始翻译,把汇编语言翻译成二进制就停下来
gcc code.o -o code:连接生成可执行的文件
gcc -c code.c:默认生成 .o 文件
ldd 可执行程序:查看可执行程序所依赖的库
如何理解条件编译?
gcc支持命令行式的宏定义
gcc code.c -o code -DM:其中-DM表示命令行级别的宏定义
gcc code.c -o code -DM=100:
预处理的本质就是修改编辑我们的文本代码
条件编译的用途?
- 软件根据专业度,收费情况进行区分(业务),使用条件编译,可以进行代码动态裁减
- 内核原代码也是采用条件编译进行代码裁减
- 开发工具,应用软件
为什么C/C++编译要先变成汇编?
编程的本质就是控制计算机。
开关 -> 打孔编程(二进制) -> 汇编语言 -> C/C++/Java/python/......
编译是逆历史发展的过程
汇编语言 -> 编译器产生(汇编语言的编译器是用二进制写的,二进制版汇编编译器,编译汇编语言,再用汇编写一个汇编编译器)
以上过程是编译器的语言自举过程
什么叫动态库什么叫静态库,如何理解?
库:库是一套方法或者数据集,为开发提供最基本的保证(基本接口能,加速二次开发)
共享库:被多个程序共享,一旦缺失,会导致所有程序无法执行。
动态库
在Linux下以 .so 结尾,Windows下以 .dll 结尾
动态库内部实现的方法 和 我们自己的程序,会使用库中的方法连接起来。让我们自己的程序能在库中找到方法形成可执行程序。
执行目标方法,需要跳转到库中执行,完了再返回动态链接的过程只是在地址上产生关联。
静态库
Linux下 .a 结尾,Windows下 .lib 结尾
静态链接就是将源文件拷贝一份到目标位置
把我们程序中使用的库方法,拷贝给我自己。静态库只在链接的时候有用,一旦形成可执行程序,静态库可以不再需要。
关于动态库:
动态库的本质:把语言层面公共的代码,在内存中未来只出现一份!
动静态库对比:
- 动态库形成的可执行程序体积一定很小,静态库大
- 可执行程序对静态库的依赖小,动态库不能缺失
- 程序运行需要加载到内存,静态链接,会在内存中出现大量重复代码
- 动态链接比较节省内存和磁盘资源
技术上理解一下库:
1.c 2.c 3.c ->(编译) 1.o 2.o 3.o -> 链接.o => exe
链接的本质是把所有的 .o 打包合并
Linux项目自动化工具 - make/Makefile
这部分是这篇博客中最重要的一个部分。
make/amkefile是什么?
make是一个命令makefile是一个文件
make
make是一个自动化构建工具,它根据一个叫Makefile的"施工图纸",自动决定先编译哪个文件、后编译哪个文件,最终生成你想要的可执行程序或库。
它的核心作用是避免重复劳动:你修改了哪几个源代码文件,make就只重新编译那几个,而不是把整个项目全部编译一遍(这在大项目中能节省大量时间)。
make是怎么知道新旧问题的呢?
不知道各位是否还记得之前提到过的stat命令

我们只需要看modify的值是否改变就可以判断出这个文件的新旧问题以及是否需要进行再次编译。
Makefile
Makefile的基本概念 ------ 依赖关系、依赖方法
Makefile文件的基本内容:
第一行称之为依赖关系 :code依赖code.c
左侧是依赖文件,右侧是依赖关系列表,依赖关系列表可以是多个也可以为空
后一行称之为依赖方法 ,必须以tab开头,表示内容是依赖什么样的方法形成的

当一个Makefile文件中存在多组依赖关系和依赖方法时,make命令扫描makefile文件的时候,从上往下扫描,默认形成第一个目标文件。
那前面的.PHONY是什么意思呢?
它代表的是伪目标 。
伪目标:对应的依赖关系和依赖方法总是被执行。不加修饰只能执行一次。用 .PHONY 修饰意味着忽略对比新旧问题
makefile推导规则:根据依赖关系链自动推导,不满足条件直接入栈,找到再依次出栈

$@永远代表依赖的最终的目标文件
$^对应依赖的众多文件列表
$<第一个依赖文件
在依赖方法前面加上@代表是静默编译,不会再打印出来
也可以echo自定义想要输出的,加上@也可以使echo也不打印出来