目录
1.Linux软件的安装
2.Linux vim
2.1编写代码
2.2编译代码
2.3调试代码
3.自动化构建工具-make/Makefile
4.Linux第一个小程序:进度条
5.使用git命令行
1.源码安装
2.rpm安装
3.因为Linux开发中可能存在大量的软件之间的依赖关系,所以上面2种安装时非常麻烦的,安装B需要先安装A或者C,因此我们使用yum:本身会考虑依赖关系。yum和手机上的应用市场一样。
把Linux所有能安装的文件都列出来,普通用户需要提升权限sudo ,这里使用root用户操作,因为还没有添加信任,所以不能sudo:
筛选出sl.x86_64 .是转义字符,防止转义:
安装sl.x86_64
不想被提示:yum install -y sl.x86_64
输入sl 运行这个软件:小火车
卸载sl.x86_64 软件
yum remove sl.x86_64
yum remove -y sl.x86_64 不提示是否安装
在云服务器自带的man手册是精简手册,只能查指令,很多功能不全
安装man :
安装cowsay:
在安装软件的时候,yum怎么知道软件在那台服务器上呢?,其实内置了地址。
yum源所在:
CentOS-Base.repo 是基础服务。在找软件的时候,最先找这个文件。
一般都是国外的需要更新成国内的 :
1.先打开源所在目录
cd /etc/yum.repos.d/
2. 备份原来的yum源
mv CentOS-Base.repo CentOS-Base.repo.backup
3.使用阿里源替换原来的源
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
4.清除yum缓存并更新
yum clean all
yum makecache
一般安装软件时不一定都在CentOS-Base.repo,它是官方的稳定的、老的软件;有一些非官方的,新的,不太稳定的在epel下,所以安装扩展源:
yum install -y epel-release
需要注意:yum工作,必须要联网,centos里面,只能有一个yum在运行,装软件一个个来。
安装lrzsz,完成windows文件或数据拖拽到到Linux中:
不想拖拽可以rz,把windows文件上传到Linux。
sz+文件名,把文件传到windows上。rz和sz都是打包在lrzsz中。
在windows中的VS2019是把编写代码、编译代码、调试代码、(发布代码,运行)、代码关系的维护全部集成在了一起。
vi、vim(vim是vi的升级版):文本编辑器,从定位上,和记事本没有任何差别。是一个文本编辑器,主要用于编写代码。
vim在打开文件的时候,若是没有该文件,就会创建这个文件。
vim是多模式编辑器,主要工作模式:命令模式、插入模式、底行模式。
1.命令模式下的操作
光标操作:
H 光标左移 L光标右移 J光标下移 K光标上移
shift+^(光标移动到行首) shift+$ (光标移动到行尾)
gg起始行(最开始) shift+g结束行(最后一行) n+shift+g(跳转到指定行)
b/w 按照单词位单位进行前/后光标移动
文本操作:
yy:复制当前行 n(行数)+yy:复制当前行及其之后的n行,包含当前行
u:撤销 ctr+r: 撤销最近的撤销 p:粘贴, np:一次粘贴n份
dd:删除光标所在行,ndd向下n行删除,包括当前行
dd->p(dd后使用p):剪切,支持np
shift + ~ 对文本快速大小写切换
x:删除光标后的一个字符,支持nx
X:删除光标前的一个字符,支持nX
r:替换一个字符,光标所在字符,支持nr
shift+r:替换模式(第4种模式),直接进行多个内容的替换 esc退出
2.底行模式下操作
进入底行:shift + :
set nu: 调出行号
ser nuno:取消行号
分屏操作:vs+文件名 比如:我当前打开的是test.c,分屏打开file.c ,输入vs file.c
光标在文件之间的切换ctrl+ww ,光标在哪就操作那个文件。
w:保存 q:退出
! 强制
vim配置
vim配置在自己的配置文件中,只会影响自己的操作。
root有自己的vim配置文件,只影响自己。
总结:只会影响自己
如何配置自己的vim?
在自己当前工作路径下没有 .vimrc
需要自己创建 .vimrc ,最基本的配置都写在了.vimrc文件中。
使用vim打开.vimrc文件,进行配置vim:增加行号
再使用vim打开文件就有了行号:
其他的vim配置可以在百度上找,自己配置它麻烦了,知道怎么配置就行了。这里提供一个自动配置的vim的链接仅支持centos7,直接复制到命令行就行了,然后输入root密码,自己就配置了:
curl -sLf https://gitee.com/HGtz2222/VimForCpp/raw/master/install.sh -o ./install.sh && bash ./install.sh
如何添加用户信任:
用户换为root
打开以下文件:
找到100行左右:在这里添加相应用户的信任
Linux 编译器-gcc/g++使用:
使用vim编写一段代码:
对代码直接编译:gcc test.c 但是出来都是a.out,自定义名字:gcc test.c -o test :
gcc test.c -o test 在翻译时,主要分为预编译,编译 ,汇编,链接的过程:
1.对代码进行预编译(预处理) .i :gcc -E test.c -o test.i ,打开test.i文件。头文件的展开,宏替换,以及注释使用空行代替:
2.对代码编译 .s:gcc -S test.i -o test.s 形成汇编代码,以及语法错误检查:
计算机是不可以直接执行汇编语言的,需要继续转换成二进制代码
3.汇编 .o文件:将代码转换成二进制指令(机器识别代码) gcc -c test.s -o test.o
汇编形成的二进制文件,但是并不可以直接执行,叫作可重定向目标文件。还差链接,在使用C语言的时候,会使用库函数(比如:printf),语言也是有库的,库主要是一套头文件和一套库文件(libc.a(静态库),libc.so(动态库)),需要链接将我们自己的代码中的函数调用,外部数据,和库关联起来。
4.链接:形成可执行程序 gcc test.o 或gcc test.o -o test
如何理解链接?
ldd可以查看文件依赖的第三方动态库的命令:
test就是依赖libc.so第三方库的,C语言的标准库。
在Linux中分为静态库( .a)和动态库( .so),都和程序成功运行有关。所以链接是:自己写的C程序和语言上或第三方提供的方法,关联起来。
链接分为:静态链接和动态链接
动态链接:在编译链接时并没有把库文件的代码加入到可执行文件中,而是在程序执行时由运行时的链接文件加载库,这样可以节省系统的开销。
静态链接:编译连接时,把库文件的代码全部加入到执行文件中,因此生成的文件比较大,但在运行时也就不在需要库文件了。
Linux中,gcc默认情况下是动态链接,生成的可执行程序:
使用file也以看到文件属性:
我想可执行程序静态链接:gcc test.c -o test_static -static
发现报错了,因为gcc是没有安装静态库的,需要自己安装:
需要安装gblic-static:
sudo yum install -y glibc-static.x86_64
静态链接可执行文件与动态链接可执行文件:动态库是依赖库,库丢了就不能执行了。静态库不依赖库,可以移植性好。
静态链接的时候,需要.a静态库,动态链接的时候,需要.so动态库,默认的是动态链接。
编译c++程序使用g++,g++也可以编译C语言,gcc不能编译c++代码,最好C语言就是用gcc,C++就使用g++,g++的指令和gcc没有太大的区别,基本一样。
g++ test.cpp -o test:
linux调试器-gdb的基本使用
退出ctrl+d 或 输入指令quit。
进入gdb后执行指令,会提示没有符号加载。
使用readelf -S +文件 :可以查看可执行程序的段构成,一个可执行程序由那些构成。如果一个程序可以被调试,该程序的二进制文件一定加入了一些debug信息。程序的发布方式有2种:debug和release模式。在vs中,在debug加入了一些debug的信息,所以是可以调试的,release没有加载,因此是不能调试的。在Linux gcc/g++出来的二进制程序,默认是release模式,因此是不能调试的。如果想要使用gdb调试,必须在源代码生成二进制程序的时候,加上-g 选项。
加上debug信息:debug比release可执行文件大,因为加入了debug信息。
使用readelf -S +可执行文件:发现加入了debug的信息。
gdb基本调试指令:
调试代码:
这里支持在for循环里建立变量for(int i=0;i<= top;i++),必须使用C99:
r/run运行程序:
list/l 列出代码:每次l都是接着上一次向下列出代码
break/b +行号:在某一行设置断点:
继续run,发现在断点停下来了
step/s :进入函数内部,相当于VS的 F11
n/next 单步执行 相当于F10
display +变量名:跟踪查看一个变量,每次停下里都显示它的值
print/p+变量名:打印变量值对应的变量值,只显示一次
undisplay+编号:取消对先前设置的那些变量的跟踪。不监控变量了。
finish:执行到当前函数返回,然后停下来等待命令
continue:代码继续执行,执行到下一个断点停下来。
until+行号:程序执行到指定行停下来,程序正常执行。
delete breakpoints n 或 d n:删除序号为n的断点
disable breakpoints n/disable n 禁用断点:y(yes) 变为了n(no)
enable n / enable breakpoints n 启用断点:
break+函数名:在函数代码第一行打断点:
在int sum =0;处打了断点。
l+函数名:查看函数代码
breaktrace/bt:查看各级函数调用及参数,就和VS中查看调用堆栈一样。
set val 修改变量值:
1.make是一条命令,makefile是一个文件
2.文件和文件之间的互相依赖关系 比如一个项目有很多.c文件,先编译那个文件,后编译那个文件。还有.h文件。
3.makefile文件内包括:依赖关系和依赖方法。
4.make和makefile 配合形成可执行程序的目的。
1.创建文件makefile/Makefile
2.编辑makefile文件,使得test.c编译为可执行
3.make一下,自动执行makefile,直接生成test
5.对项目的清理
6.删除可执行文件
为什么我编译文件的时候直接make,而清理文件需要make clean?
make扫描makefile文件的时候,默认只会形成一个目标依赖关系,一般是第一个。
我再执行make,就会执行clean
建议生成文件的依赖放前面。
.PHONY是什么?
.PHONY修饰对应的符号,伪目标的概念,伪目标:总是可执行的
当我一直make时,源文件没有做过修改不需要重复编译。
而make clean 是伪目标,因此总是可执行的,即使test文件没有了
当使用.PHONY修饰test时: 总是可以被执行的 ,一般目标可执行程序不需要这样写,只是举例:
对makefile文件进行改进:
$^表示的是冒号右边的文件列表(test.c)。 $@表示依赖关系中的目标文件 (test)
也可以这样写(但是不推荐)
1.理解回车和换行:
在语言上回车换行是:\n
在实际当中,回车:回到当前行的起始位置。 换行:位置不变新起一行。
此代码执行时,会先打印出hello world 的字符串,3秒后程序结束显示命令行。
若是不带\n:会发现过了3后才显示hello world 并且程序结束了。
这里的原因是什么?
这里是sleep先于hello world 吗,绝对不是的。printf是先运行的,但是数据没有被立即刷新到显示器上,没有\n,字符串会暂时保存起来,存在了缓冲区(用户C语言级别的缓冲区)。显示器的刷新策略就是行刷新\n即进行刷新。
C语言程序,默认会打开三个输入输出流 stdin(键盘)、stdout(显示器)、stderr
man stdin 查看:都是FILE* 类型的
其实,凡是显示到显示器上面的内容都是字符,凡是从键盘读取的内容都是字符。显示器和键盘叫做字符串设备。比如scanf("%d",&a),这里会把键盘的输入的字符转换为10进制,存入内存中。
刷新一下缓冲区,结果一下在屏幕上直接打印了hello word, 3s后程序结束
实现进度条程序:
1.理解\r 只回车,不换行
会在同一个位置打印 5 4 3 2 1.
2.进度条程序:
查看git的版本:
若是没有就安装:yum install git
使用码云创建仓库:
.gitignore可以忽略编译时产生的一些临时文件。许可证不用选。
复制仓库的链接:
把远程仓库克隆到本地:git clone
.git 是本地仓库,这个文件不要乱动。
把文件添加到本地仓库:
git status 命令用于查看在你上次提交之后是否有对文件进行再次修改。
git 三板斧
1.add
2.commit ,必须带-m 添加日志信息,否则会报错
3.push
最终远程仓库更新完成:
git log 可以查看日志信息
.gitigonre文件:
打开文件,在上传到远程仓库时,会忽略这些后缀的文件。这就是.gitigonre文件的作用。