1.软件包管理器
1.1什么是软件包
• 在Linux下安装软件, ⼀个通常的办法是下载到程序的源代码, 并进⾏编译, 得到可执⾏程序.
• 但是这样太⿇烦了, 于是有些⼈把⼀些常⽤的软件提前编译好, 做成软件包(可以理解成windows上
的安装程序)放在⼀个服务器上, 通过包管理器可以很⽅便的获取到这个编译好的软件包, 直接进⾏安
装.
• 软件包和软件包管理器, 就好⽐ "App" 和 "应⽤商店" 这样的关系.
• yum(Yellow dog Updater, Modified)是Linux下⾮常常⽤的⼀种包管理器. 主要应⽤在Fedora,
RedHat, Centos等发⾏版上.
• Ubuntu:主要使⽤apt(Advanced Package Tool)作为其包管理器。apt同样提供了⾃动解决依
赖关系、下载和安装软件包的功能。
1.2Linux软件生态(重要)
1.3yum具体操作
1.查看软件包:
注意事项:
• 安装软件时由于需要向系统⽬录中写⼊内容, ⼀般需要 sudo 或者切到 root 账⼾下才能完成.
• yum/apt安装软件只能⼀个装完了再装另⼀个. 正在yum/apt安装⼀个软件的过程中, 如果再尝试⽤
yum/apt安装另外⼀个软件, yum/apt会报错.
• 如果 yum / apt报错, 请⾃⾏百度.
3.卸载软件:sudo yum remove [-y] lrzsz(windows与Linux之间互传文件的软件)
2.编译器Vim
1.vim的基本概念:
vim有好多种模式(主要三种):1.命令模式(command mode). 2.插入模式(insert mode). 3.底行模式(last line mode)
2.vim命令集
:! 不用退出vim就可以进行指令。
Ctrl + w + w多个分屏间循环移动光标;Ctrl + w + l:把光标移到右边的分屏;Ctrl + w + h:把光标移到左边的分屏
shift+z+z : 快捷键保存并退出
3.vim配置
3.编译器gcc/g++
背景知识
1. 预处理(进⾏宏替换/去注释/条件编译/头⽂件展开等)
2. 编译(⽣成汇编)
3. 汇编(⽣成机器可识别代码)
4. 连接(⽣成可执⾏⽂件或库⽂件)
ldd:用于显示可执行程序或动态链接库所依赖的其他共享库。
2.动态链接和静态链接:
1.在我们的实际开发中,不可能将所有代码放在⼀个源⽂件中,所以会出现多个源⽂件,⽽且多个源⽂ 件之间不是独⽴的,⽽会存在多种依赖关系,如⼀个源⽂件可能要调⽤另⼀个源⽂件中定义的函数, 但是每个源⽂件都是独⽴编译的,即每个*.c⽂件会形成⼀个*.o⽂件,为了满⾜前⾯说的依赖关系,则 需要将这些源⽂件产⽣的⽬标⽂件进⾏链接,从⽽形成⼀个可以执⾏的程序。这个链接的过程就是静态链接。静态链接的缺点很明显:
• 浪费空间:因为每个可执⾏程序中对所有需要的⽬标⽂件都要有⼀份副本,所以如果多个程序对
同⼀个⽬标⽂件都有依赖,如多个程序中都调⽤了printf()函数,则这多个程序中都含有
printf.o,所以同⼀个⽬标⽂件都在内存存在多个副本;
• 更新⽐较困难:因为每当库函数的代码修改了,这个时候就需要重新进⾏编译链接形成可执⾏程
序。但是静态链接的优点就是,在可执⾏程序中已经具备了所有执⾏程序所需要的任何东西,在
执⾏的时候运⾏速度快。
2.动态链接的出现解决了静态链接中提到问题。动态链接的基本思想是把程序按照模块拆分成各个相对独⽴部分,在程序运⾏时才将它们链接在⼀起形成⼀个完整的程序,⽽不是像静态链接⼀样把所有程序模块都链接成⼀个单独的可执⾏⽂件。动态链接其实远⽐静态链接要常⽤得多。
3.静态库和动态库
• 我们的C程序中,并没有定义“printf”的函数实现,且在预编译中包含的“stdio.h”中也只有该
函数的声明,⽽没有定义函数的实现,那么,是在哪⾥实“printf”函数的呢?
• 最后的答案是:系统把这些函数实现都被做到名为 libc.so.6 的库⽂件中去了,在没有特别指定
时,gcc 会到系统默认的搜索路径“/usr/lib”下进⾏查找,也就是链接到 libc.so.6 库函数中去,这样
就能实现函数“printf”了,⽽这也就是链接的作⽤
1.静态库是指编译链接时,把库⽂件的代码全部加⼊到可执⾏⽂件中,因此⽣成的⽂件⽐较⼤,但在运 ⾏时也就不再需要库⽂件了。其后缀名⼀般为“.a ”
2.动态库与之相反,在编译链接时并没有把库⽂件的代码加⼊到可执⾏⽂件中,⽽是在程序执⾏时由 运⾏时链接⽂件加载库,这样可以节省系统的开销。动态库⼀般后缀名为“.so”,如前⾯所述的 libc.so.6 就是动态库。gcc 在编译时默认使⽤动态库。完成了链接之后,gcc 就可以⽣成可执⾏⽂ 件。
3.gcc默认⽣成的⼆进制程序,是动态链接的,这点可以通过 file 命令验证。
4.自动化构建-make/Makefile
1.背景
• ⼀个⼯程中的源⽂件不计数,其按类型、功能、模块分别放在若⼲个⽬录中,makefile定义了⼀
系列的规则来指定,哪些⽂件需要先编译,哪些⽂件需要后编译,哪些⽂件需要重新编译,甚⾄
于进⾏更复杂的功能操作• makefile带来的好处就是⸺“⾃动化编译”,⼀旦写好,只需要⼀个make命令,整个⼯程完全
⾃动编译,极⼤的提⾼了软件开发的效率。• make是⼀个命令⼯具,是⼀个解释makefile中指令的命令⼯具,⼀般来说,⼤多数的IDE都有这
个命令,⽐如:Delphi的make,Visual C++的nmake,Linux下GNU的make。可⻅,makefile
都成为了⼀种在⼯程⽅⾯的编译⽅法。• make是⼀条命令,makefile是⼀个⽂件,两个搭配使⽤,完成项⽬⾃动化构建。
myproc:myproc.cgcc -o myproc myproc.c
.PHONY:clean
clean:rm -f myproc//注:这里的间距必须用tab
2.基本使用
3.进一步理解
1. make会在当前⽬录下找名字叫“Makefile”或“makefile”的⽂件。2.如果 myproc 所依赖的 myproc.o ⽂件不存在,那么 make 会在当前⽂件中找⽬标为
myproc.o ⽂件的依赖性,如果找到则再根据那⼀个规则⽣成 myproc.o ⽂件。(这有点像⼀
个堆栈的过程)3.这就是整个make的依赖性,make会⼀层⼜⼀层地去找⽂件的依赖关系,直到最终编译出第⼀个
⽬标⽂件。4.make只管⽂件的依赖性,即,如果在我找了依赖关系之后,冒号后⾯的⽂件还是不在,那么对
不起,我就不⼯作啦。
1.wildcard函数:
这是 Makefile 中的一个内置函数:用于展开为当前目录下所有符合模式的文件列表
如:模式是*.c,所以$(wildcard *.c)会查找当前目录下所有扩展名为.c的文件,
并将这些文件名组成一个列表赋值给变量SRC。
例如,如果当前目录下有main.c、utils.c两个 C 源文件,那么SRC的值就会是main.c utils.c。2.OBJ=$(SRC:.c=.o)
变量替换语法:将变量SRC中所有文件名的后缀.c替换为.o。
*5.Linux第一个程序-进度条
预备知识:0.int a = 123456;
printf("%d", a);在显示器上它并不是整数而是字符串1.回车换行问题:
回车换行(\n)不是一个概念:它是先回到该行的最前面(\r),再换行.2.用户缓冲区问题:
示例:
#include<stdio.h>
#include<unistd.h>
int main()
{printf("hello world");sleep(2);return 0;
}//现象是先休眠两秒,再出现hello world但是程序执行的顺序一定是从上到下,那在sleep时,hello world字符串哪去了?
答:在C语言缓冲区中!!!
缓冲区刷新我们才能看到之前存储在缓冲区里的内容缓冲区刷新策略:
1.\nor\r\n,\n之前所有内容,全部刷新到显示器
2.程序退出的时候,曾经的历史数据,会被刷新
3.我们还可以强制刷新看到:int fflush(FILE *stdout)
【extern FILE *stdout (标准输出->显示器)】
可以直接从之前写好的mv过来
./count(用于运行当前目录下名为 count
的可执行文件," ./ " 表示当前目录)
改进后若把9改为10,则10,90,80...(侧面说明了打到显示器上的是字符串不是整数,所以往前覆盖时只盖住了1,而不是10)
cat *(*是通配符,代表当前目录下所有文件) ;vs 文件(分屏操作)
cp ../Makefile . (将上一级目录中的 Makefile
文件复制到当前所在的目录中);
cp 用于复制文件或目录的命令;
../Makefile
指的是当前目录上一级目录中的名为Makefile
的文件。.
表示目标位置,这里的.
代表当前目录。
man 用于查找命令的用法
这里当rate超过100要手动修改一下等于100,不然会导致越界!!!ovo
6.版本控制器Git
1.理解git的作用
为了能够更⽅便我们管理不同版本的⽂件,便有了版本控制器。所谓的版本控制器,就是能让你了解到⼀个⽂件的历史,以及它的发展过程的系统。通俗的讲就是⼀个可以记录⼯程的每⼀次改动和版本迭代的⼀个管理系统,同时也⽅便多⼈协同作业。
2. 将linux代码提交到git上:
3.gitignore(忽略次要文件)
4.git status(用于查看当前工作目录和暂存区的状态)
git status
命令能清晰显示哪些文件被修改、哪些文件是新增的、哪些文件被删除,以及哪些文件已被添加到暂存区等待提交等信息,帮助开发者随时掌握仓库的状态。
5.git pull(将更新同步到本地仓库,保证本地代码与远程仓库代码一致)
6.git log(以倒序的方式显示所有提交记录)
.......git还有很多知识,会单独出一章。。。
7.调试器 - gdb/cgdb使用
1.基本了解
• 程序的发布⽅式有两种, debug 模式和 release 模式, Linux gcc/g++ 出来的⼆进制程
序,默认是 release 模式。• 要使⽤gdb调试,必须在源代码⽣成⼆进制程序的时候, 加上 -g 选项,如果没有添加,程序⽆法被
编译1.Debug:程序员自己用,添加调试信息的
2.Release:给别人的,用户,测试,不添加调试信息的
grep文本搜索工具
2.调试命令--cgdb
调试的本质:定位问题!!!list/l 行号0:查看代码
b 行号:打断点
info b:查看断点
d 断点编号:删除
退出:ctrl + d 或 quit
找问题时可以用二分查找的策略
3.调试技巧
1.watch / 条件断点
注意:
• 条件断点添加常⻅两种⽅式:1. 新增 2. 给已有断点追加
• 注意两者的语法有区别,不要写错了。
• 新增: b ⾏号/⽂件名:⾏号/函数名 if i == 30(条件)
• 给已有断点追加:condition 2 i==30, 其中2是已有断点编号,没有if