文章目录
- [Linux软件管理器 yum](#Linux软件管理器 yum)
- Linux编译器vim
- 🚩🚩Linux编译器-gcc/g++使用
- Linux自动化构建工具Makefile/makefile
- gdb
- 进度条
Linux软件管理器 yum
🚩什么是软件包
1 ,下载软件方法:下载程序的源代码,然后编译,得到可执行程序,
2,这种方法太麻烦了,所以有人把源代码打包,做成软件包放在服务器,能够直接安装软件包
软件包和软件包管理器的关系,相当于APP和应用商店,yum就是软件包管理器
安装软件
⭐ 例如gcc安装
sudo yum install lrzsz
注意:
1,安装要切换到root用户,如果子用户输入su 再输入root密码切换root用户
2,yum下载是装完一个再下载另一个
好玩的软件
移动火车
sudo yum install sl
下载完成输入sl
会说话的奶牛
sudo yum install cowsay
下载完成后输入 cowsay "hello"
卸载
也是一条命令
sudo remove lrzsz
Linux编译器vim
vim基本概念
vim有好多模式,我们主要学习3种,分别是命令模式,插入模式,底行模式
- 命令模式(normal mode):就是普通模式,进行光标移动,字符或行删除,移动复制进入某区段,以及按 i 进入插入模式,按:进入底行模式
- 插入模式(insert mode):只有在该模式下,才可以输入文本,按esc回到命令模式
- 底行模式(last line mode):文件保存退出,也可以进行文件替换,给文本添加行号 :wq保存并退出,:q不保存退出
vim命令模式命令集
假设有个文件 text.txt
vim text.txt
进去就是命令模式,
gg :定位光标到第一行开头
shift+g:定位光标到最后一行开头
n+shift+g:定位光标到目标行开头
shift+^: 定位光标到当前行开始
shift+¥:定位光标到当前行末尾
w,b: 单词按照光标跨单词移动
h,j,k,l,光标左下上右移动
(n)yy:复制当前(n)行
(n)dd:剪切(删除)当前行
(n)p:粘贴当前行到光标下一行
u:撤销
crtl+r:撤销上次撤销
🚩🚩Linux编译器-gcc/g++使用
代码到执行,编译器进行4步
1,预处理(进行宏替换)
2,编译(生成汇编)
3,汇编(生成机器可识别代码)
4,链接(生成可执行程序)
预处理
假设有文件 test.c
⭐ 功能:宏定义,文件包含,条件编译,去掉注释
使用:
gcc -E test.c -o test.i
-E 代表代码进行完预处理后停止编译过程
-o 是目标文件,test.i是预处理后的代码
编译
功能:检查代码规范性,是否有错误, 来确定代码要干的工作,无误后生成汇编代码
使用:
gcc -S test.i -o test.s
-S代表编译后停止汇编过程
汇编
功能:生成机器可识别的二进制目标代码
使用:
gcc -c test.s -o test.o
⭐链接
使用:
gcc test.o -o test
假设这个程序中有printf函数
问题来了:
🚩 <stdio.h>中只有printf声明,我们在代码块中也没实现printf函数,那么printf函数到底怎么实现的呢
答案:系统把这些函数都放进lib.c.so.6文件中了,使用时gcc会系统默认搜索路径去user/lib寻找,也就是链接到lib.c.so.6库文件中,就能实现printf函数,这就是链接作用
函数库
静态库:
指的是,编译链接时,把库文件全部拷贝到可执行文件中,因此文件比较大,但是后续再也不需要库文件了 后缀 .a
静态编译
gcc test.c -o test -static
动态库:
没有拷贝,程序执行时链接文件加载库,可以减少系统开销,后缀一般 .so,如上面的lib.c.so.6
gcc默认编译使用动态库,可以用file验证
明显看到静态文件比动态大几十倍,
默认dynamically linked
Linux自动化构建工具Makefile/makefile
makefile好处:自动化编译,写好了直接make命令就可以完成整个项目的编译
make是命令,makefile是文件
使用
本来需要g++ text.c -o mytext
现在只需要make命令就行 ,自动生成mytext可执行文件
make只会执行第一条指令
依赖关系
c
mytext:mytext.o
g++ mytext.o -o mytext
mytext.i:text.c
g++ -E text.c -o mytext.i
mytext.s:mytext.i
g++ -S mytext.i -o mytext.s
mytext.o:mytext.s
g++ -c mytext.s -o mytext.o
.PHONY:clean
clean:
rm mytext
生成mytext需要mytest.o接下来会自动寻找执行,
🚩原理
1,使用make,会在当前目录寻找makefile或Makefile文件
2,如果没有mytext文件或者后面mytext.o修改时间比mytext新,会把mytext作为最终目标去生成,
用stat查看时间
以Change修改时间为准,(每次cat grep都会修改Access时间,导致不必要的重新编译)
改变文件属性就是Change(w.r.x,重命名也是),只有改变文件内容才是Modify
若mytext.o修改时间新于mytext,用make生成mytext文件,否则make不会更新
🚩清理
- 项目是需要被清理的
- clean没有和第一个文件直接或间接关联,所以不会自动执行,但是可以用make clean清理
- 我们给clean伪目标.PHONY,意思是总是被执行的
gdb
背景:
1,程序发布两种模式debug release
2,默认release
3,采用gdb调试。必须在生成二进制代码时 加上 -g
启动 gdb ./可执行文件
-
list/l 行号:显示binFile源代码,接着上次的位置往下列,每次列10行。
-
list/l 函数名:列出某个函数的源代码。
-
r或run:运行程序。
-
n 或 next:单条调用。
-
s或step:进入函数调用
-
break(b) 行号:在某一行设置断点
-
break 函数名:在某个函数开头设置断点
-
info break :查看断点信息。
-
finish:执行到当前函数返回,然后挺下来等待命令
-
print( p):打印表达式的值,通过表达式可以修改变量的值或者调用函数
-
p 变量:打印变量值。
-
set var:修改变量的值
-
continue(或c):从当前位置开始连续而非单步执行程序
-
run(或r):从开始连续而非单步执行程序
-
delete breakpoints:删除所有断点
-
delete breakpoints n:删除序号为n的断点
-
disable breakpoints:禁用断点
-
enable breakpoints:启用断点
-
info(或i) breakpoints:参看当前设置了哪些断点
-
display 变量名:跟踪查看一个变量,每次停下来都显示它的值
-
undisplay:取消对先前设置的那些变量的跟踪
-
until X行号:跳至X行
-
breaktrace(或bt):查看各级函数调用及参数
-
info(i) locals:查看当前栈帧局部变量的值
-
==quit:退出gdb ==
进度条
c
#include "progressBar.h"
int main()
{
progressbar(40000);
return 0;
}
progressBar/makefile
c
progress:progressBar.cpp main.cpp
g++ -o $@ $^
.PHONY clean:
rm progress
progressBar/progressBar.cpp
c
#include "progressBar.h"
#include <unistd.h>
#include <cstring>
#define NONE "\033[m"
#define RED "\033[0;32;31m"
#define LIGHT_RED "\033[1;31m"
const char* lable="/-\\|";
char bar[NUM];
void progressbar(int speed)
{
Initbar();
size_t len=strlen(lable);
for(int i=0;i<=TOP;)
{
printf(LIGHT_RED "[%-100s]" NONE RED "[%d%%] [%c]\r" NONE,bar,i,lable[i%len]);
fflush(stdout);
bar[i]=body;
i++;
if(i!=TOP)
{
bar[i]='>';
}
usleep(speed);
}
fflush(stdout);
printf("\n");;
}
void Initbar()
{
memset(bar,'\0',sizeof(bar));
}
progressBar/progressBar.h
c
#pragma once
#include <iostream>
#include <cstdio>
using namespace std;
#define NUM 102
#define TOP 100
#define body '='
#define right '>'
extern void progressbar(int speed);
extern void Initbar();