像vs2019这样的编译器是集成编译器,是集合了编辑器,编译器,和Debug为一身的工具,但是在Linux是分开的,编辑器就是编辑器,编译器就是编译器,和Debug的工具。虽然不好用,但是要学会如何使用。
vim有三种比较基础的模式:普通模式、插入模式、低行模式。
在普通模式下按 i 进入插入模式,只有在插入模式下才能进行文字的输入,按ESC可以返回普通模式。
在普通模式下 按 shift+: ,进入低行模式,可以进行文件的保存和退出,也可以进行文本的替换,查找字符串。
底行模式跟平时在Linux下写指令一样,也可以记住历史输入过的指令。
打开一个文件直接使用 vim + 文件名,如果没有此文件也可以进入!保存退出后会自动生成这个文件,所以要注意有时候打开文件的时候,发现是空的要去看看是不是文件名打错了!!!。
打开文件后非常常用的两个操作:w(保存),q(退出),!(强制)。可以单个操作也可以一起使用,需要在插入模式下才能使用。
光标:
光标的移动可以使用键盘上的方向键,但是vim默认的移动键是 h(左),j(下),k(上),l(右)。
PS:巧记键盘最左 h,键盘最右 l,jump(往下落),king(王在上)。
gg:光标定位到文件最开始。
shift + g(大写的G):光标定位到结尾。
PS:这两个命令很有用,这里要说明一下,在vim编辑文件的时候,是不能用鼠标滚轮来翻页的!
shift + 6 (^):将光标定位到当前行的最开始。
shift + 4 ($):将光标定位到当前行的结尾。
w,b:以单词为单位进行光标的前后移动。
yy:从光标开始的位置,复制光标所在行。在命令前面加上数字可以进行多行复制,比如 6yy 就是从光标位置复制6行。
p:把复制的数据粘贴到光标所在位置。
dd:将当前光标位置的行剪切(也可以当删除使用)。
shitf + ~:把选中的字符进行,大小写切换。
shift + r(大写的R):替换模式,在不删除字符的情况下,输入新的来替换,按ESC退出。(不是很好用,还要切换模式,不如删了重写)
单输入一个 r:单替换光标处的一个字符。前面输入数字,可以多个字符一起替换,6r就是替换6个字符。
x 或者 (shift+x):小写的x是删除光标当前字符,大小的X是删除光标前面的字符。前面可以加数字删除多个字符。
u:撤销操作,可以当做平时用的Ctrl+z。
ctrl + r:撤销 u 的操作。(撤销撤销操作,但是注意不能撤销自己的操作,撤销自己的操作还是用 u )
set nu/nonu:开启行号,或者取消行号。
vs:开启对比模式(分屏,光标在哪里操作就在哪里),输入q可以退出分屏。
ctrl + ww:分屏模式下跳转光标。
vim的操作指令非常多,死记的话也比较难记,建议熟练掌握增、删、改、查就可。
vim需要在文件进行配置,像输入一个字符就给出可能要的函数这种辅助功能,都需要自己设置。
不过这里设置起来很麻烦,学习成本也高,而且没多大用,可以使用网上已经有的开源配置。
VimForCpp: 快速将vim打造成c++ IDE
只需要输入一行命令即可, 方便快捷,记得给星给好评。
这里要注意gcc是一个专门用来编译连接C语言程序的编译器。而g++是c++的,g++可以用来编译c语言,反之则不行。
gcc -v,g++ -v 查看版本
程序的编译流程:
gcc mytest.c -o test
这里是直接把源文件生成一个可以执行文件test,省略了其他步骤。也可以分解开来观察区别。
gcc -E mytest.c -o mytest.i
把代码预处理的结构生成到 mytest.i 文件里面
-E:从现在开始进行程序的翻译,如果预处理完成就停下来。
这里是预处理后的文件,完成了头文件展开、去注释、宏替换
gcc -S mytest.i -o mytest.s
-S:从现在开始开始进行程序的翻译,如果编译完成就停下来。
生成一个代码转化为汇编的文件。
gcc -c mytest.s -o mytest.o //.o是可重定位目标文件
进过汇编后,生成的二进制文件。这个文件不能直接运行。
-c:从现在开始进行程序的翻译,如果汇编完成就停下来。
全是一堆看不懂的二进制代码。
gcc mytest.o -o mytest
程序的链接,生成可执行程序mytest。
PS:巧记方法ESc是键盘最左上角的按键,iso是镜像文件后缀。
在Linux下如果每次编译一个文件,都要输入如此多的指令,麻烦而且效率低下,那么这里可以使用makefile来帮忙减少劳动量。
make是一个命令,makefile是一个文件,里面写的就是上面编译连接的指令。一般用的少,主要要学习自动构成makefile的工具,比如Cmake。
编写makefile:a、依赖关系 b、依赖方法
可以直接使用vim来编辑Makefile。
mytest:mytest.c 就是依赖关系,gcc mytest.c -o mytest 就是依赖方法。下面的clean是伪目标,一般写的是删除文件的指令。
这里输入make命令就相当于输入了编译链接的指令,会进行程序的编译链接。而输入make clean就可以执行删除的指令,来删除生成的可执行文件。
但是要注意,伪目标总是被执行的,每次make clean都会执行方法。而make指令,如果没有发现程序有改动是不会执行方法的。
makefile是如何知道可执行程序改动过?
根据ACM来判断的:A:访问时间 M:修改时间 C:修改属性的时间
makefile检查源文件和可执行程序的时间,如果源文件时间比可执行程序晚了,说明改过源代码,这时候就可以重新生成可执行程序。
如果检查到可执行程序的时间比源文件要晚,说明现在就是最新的,就不能重新生成。
这里生成两个文件test.c、test.h,然后生成一个文件main.c在里面调用test.c里面的函数。
编写Makefile,这里不用注意顺序,会自己去先执行能执行的。这里生成先生成二进制文件,再链接到一起生成可执行程序mytest。
执行检查一下没有问题。
在CentOS7里面,库文件在/lib64目录下面,一般访问库有两种方式:1、动态库。2、静态库。
在Linux系统中的文件后缀,.so(动态库) 、 .a(静态库),而在windows系统性中,.dll(动态库)、.lib(静态库)
动态链接:使用动态库里面的方法的时候,需要库文件。占用资源少。
静态链接:将库中的方法的实现,拷贝到我们的可执行程序中!编译好就可以不库文件了。但是占用资源比较多。
Linux一般默认使用的是动态链接生成可执行程序。如果要变成静态链接,生成可执行程序的时候,加上-static:使用静态链接的方式生成可执行程序。
gcc test.c -o mytest-s -static
PS:一般云上的机器不带静态库,要自己去下载。
sudo yum install -y glibc-static #C静态库
sudo yum install -y libstdc++-static #C++静态库
写代码难免会发生错误,在vs2019中有报错信息,还可以进行调试,但是在Linux下想调试要单独调试,这里使用的调试器就是gdb。
PS:程序的发布方式有两种debug和release,gcc/g++编译出来的程序默认是release模式的,如果要进行程序的调试,要使用debug模式。
gcc mytest.c -o mytest -g //加上-g就是以debug方式发布的
readelf -S mytest|grep -i debug //查看程序是不是debug模式的
如果是release模式不会出现信息,如果是debug模式会出现以下信息。
使用 gdb+程序名 直接开始调试程序。
q(quit):退出调试。直接使用快捷键ctrl+d也可以退出。
l(list):可以加数字,list 0就从0行开始打印10行代码。
r(run):开始调试,如果没有设置断点,会走完程序(真在调试的时候,再次按r会重新回到打断点的地方重新开始调试) 。
b(break):可以加数字,b18就是在18行打断点。不过这里不能看到在哪里打上了断点。
info b:查看断点。
PS:这里断点是有编号的,好用来区分。这里打了一个断点,编号就是1。
d (delete) :d 1,就是删除编号为1的断点。注意后面跟的数字是断点的编号。
n(next) :调试程序,单步步过。(就像vs2019里面的F10)
s(step):调试程序,单步步入。(就像vs2019里面的F11)
p + 变量名:打印变量内容。()
finish:将当前函数跑完,然后停下来。进入到一个函数内部的时候,可以使用这个指令快速走完这个函数。
display:设置长显示,跟踪一个变量,每次停下来都显示一下变量内容。(作用比较像vs2019里面的监视变量。每设置一个变量也会给一个编号,跟断点一样。)
undisplay + 编号:取消长显示。
until + 行号:跳转程序到指定行。
c (continue):运行之下一个断点处停下来。(如果打了多个断点)
disable/enable + 断点编号:关闭或开启指定编号的断点。(不删除断点)
gdb非常不好用,看个代码还有长度的限制,如果一个项目代码多,使用起来非常麻烦和不方便,
前面几个软件,有的在别的版本的系统上可能没有,所以要去自己下载,那么就跟平时在windows系统下下载软件一样,需要下载的工具,而在Linux下可以使用yum。
然后yum有时候下载软件会发现没有下载速度,有时候始终为0,这是因为yum的源使用了外网的源,而中国网络上有墙没法很好的访问外网,这个时候就要把源设置为国内一些开源的源。
而yum的源就是一个配置文件,位置:/etc/yum.repos.d
sudo vim /etc/yum.repos.d/CentOS-Base.repo
我这里就是腾讯的源,也可以使用其他的源。
yum三板斧:
yum list //把能下载的软件罗列出来。
yum search sl //把有sl的字符的软件搜索出来
yum list|grep sl
yum install //下载软件
yum install -y sl.x86_64 //加个-y,表示不要询问
yum remove //移除软件
非常常用且好用的工具,可把写的代码保存到网上的仓库中,方便方便代码的保存和下载。
为何叫版本控制器呢?这是因为在工作中,需要多人协作修改编写代码的,而git这个工具可以把一个项目分成多个分支,最后检查代码没问题后,再把代码合并到主分支里面去,而且如果代码还是有错误,还可以进行版本的回溯。
这里可以使用Github来保存项目,也可以使用gitee(码云)。去注册好账号后,新建一个仓库。
然后要需要这里仓库的地址
最后在git里面添加码云的邮箱和密码。
//设置用户名
git config --global user.name "username"
//设置邮箱 (没有双引号)
git config --global user.email [email protected]
//查看用户名和密码
git config user.name
git config user.email
//查看其他配置信息(git设置列表)
git config --list
打开.gitconfig增加配置信息:
[credential]
helper = store
在项目根目录执行命令:
git config --global credential.helper store
执行git需要输入账号密码的命令时会提示输入密码,此时密码会记住,以后再执行类似操作则不需要输入。
git clone + 自己仓库的地址 //下载仓库到本地
再把刚刚新建的仓库下载到系统下,把自己写的代码放到仓库里面就可以上传保存了。
git add + 你的软件 //添加文件到你的目录
提交项目。
git commit -m "这里必须写提交日志"
提交改动到本地,日志一定要写清楚,不用在乎长度,写上改动的详细内容和日期,方便别人看你项目的时候知道你干了什么。
git push //提交
同步到远端服务器。
第一次要输入账号密码。
git log //提交记录
注意要在仓库文件夹里面才能查看提交记录。
git pull //有时候无法提交,会出现提交冲突
把远程仓库里面的代码与本地的代码进行合并。
git rm +你的软件 //删除文件,但是git仓库里面不会删除
.gitignore 这个文件里面写的不会被提交到仓库里面,项目里面有些文件不是必须上传的,所以这里添加上不需要上传文件的后缀,减少要上传的空间压力。