Linux环境 基础开发工具使用
Posted 在下赵某人
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux环境 基础开发工具使用相关的知识,希望对你有一定的参考价值。
目录:
- Linux 软件包管理器 yum
- Linux开发工具 --- 编辑器vim使用
- Linux开发工具 --- 编译器-gcc/g++使用
- Linux开发工具 --- 调试器-gdb使用
- Linux开发工具 --- 项目自动化构建工具-make/Makefile使用
- Linux第一个小程序-进度条
- 相关练习:
Linux 软件包管理器 yum
什么是软件包
- 在Linux下安装软件, 一个通常的办法是下载到程序的源代码, 并进行编译, 得到可执行程序.
- 但是这样太麻烦了, 于是有些人把一些常用的软件提前编译好, 做成软件包(可以理解为软件安装程序)放在一个服务器上,
通过包管理器(可以理解为软件商店)可以很方便的获取到这个编译好的软件包, 直接进行安装. - 软件包和软件包管理器, 就好比 “安装包” 和 “应用商店” 这样的关系.
- yum是Linux下非常常用的一种包管理器. 主要应用在Fedora,RedHat, Centos等发行版上.
关于 rz、sz
rz,sz是 windows机器 和 远端的Linux机器 通过 XShell 传输文件的命令行工具。
安装:
- yum install lrzsz
用法:
- sz:将选定的文件发送到本地机器
- rz:运行该命令会弹出一个文件选择窗口,可以通过拖拽的方式将文件从本地上传到Linux服务器。
查看软件包
yum list 命令可以罗列出当前一共有哪些软件包. 包的数目可能非常多,我们需要使用 grep 命令筛选出我们需要的包。例如:
yum list | grep lrzsz
结果如下:
注意事项:
- 软件包名称: 主版本号.次版本号.源程序发行号-软件包的发行号.主机平台.cpu架构.
- "x86_64" 后缀表示64位系统的安装包, “i686” 后缀表示32位系统安装包. 选择包时要和系统匹配.
- "el7" 表示操作系统发行版的版本. “el7” 表示的是 centos7/redhat7. “el6” 表示centos6/redhat6.
- base 表示的是 “软件源” 的名称, 类似于 “小米应用商店”, “华为应用商店” 这样的概念.
如何安装软件
用install命令,例如 lrzsz 的安装:
sudo yum install lrzsz
yum 会自动下载对应的软件包,最后会进行询问,这时候敲 “y” 确认安装。最后会出现 “complete” 字样, 说明安装完成。
注意事项:
- 安装软件时由于需要向系统目录中写入内容, 一般需要 sudo 或者切到 root 账户下才能完成.
- yum安装软件只能一个装完了再装另一个. 正在yum安装一个软件的过程中, 如果再尝试用yum安装另外一个软件, yum会报错.
如何卸载软件
用remove命令,例如 lrzsz 的卸载:
sudo yum remove lrzsz
总结:
- 搜索: sudo yum list |grep xxx
- 安装: sudo yum install [-y] xxx
- 卸载: sudo yum remove [-y] xxx
Linux开发工具 — 编辑器vim使用
vi/vim都是多模式编辑器,但vim是vi的升级版本,vim兼容vi的所有指令。
安装vim:
sudo yum install [-y] vim
1. vim的基本概念
vim的三种常用模式:1.命令模式、2.插入模式、3.底行模式。
各模式的功能区分如下:
- 正常/普通/命令模式
- 控制屏幕光标的移动。
- 字符、字或行的复制、剪切、粘贴、删除。
- 进入 插入模式 下,或者到 底行模式
- 插入模式
- 只有在插入模式下,才可以做文字输入。
- 命令模式下,输入a或i或o即可进入该模式。按「ESC」键可回到命令行模式。
- 底行/末行模式
- 文件保存或退出,也可以进行文件替换,找字符串,列出行号等操作。
- 命令模式下,shift+: 即可进入该模式。按「ESC」键可回到命令行模式。
2. vim的基本操作
- 进入vim,输入:vim+文件名称,就进入vim编辑界面:
- 注意,进入vim之后,默认是处于[正常模式],要切换到[插入模式]才能够输入文字。
- [正常模式]切换至[插入模式]
- 输入a
- 输入i
- 输入o
- [插入模式]切换至[正常模式]
- 处于[插入模式],只能输入、删除文字。按「ESC」键可转到 [正常模式] 。
- [正常模式]切换至[末行模式]
- 「shift + ;」
- 退出vim及保存文件:在[正常模式]下,输入「shift+;」进入「末行模式」
- : w (保存当前文件)
- : wq (输入「wq」,存盘并退出vim)
- : q! (输入q!,不存盘强制退出vim)
3. vim正常模式命令集
- 进入、退出插入模式
- 按「 i 」进入插入模式后,从光标当前位置开始输入文件;
- 按「a」进入插入模式后,从目前光标所在位置的下一个位置开始输入文字;
- 按「o」进入插入模式后,是插入新的一行,从行首开始输入文字。
- 从插入模式切换为命令模式按「ESC」键。
- 移动光标
- 「h」、「j」、「k」、「l」,分别控制光标左、下、上、右移动
- 按「b」:光标回到上个字的开头
- 按「w」:光标跳到下个字的开头
- 按「 $ 」:移动到光标所在行的“行尾”
- 按「^」:移动到光标所在行的“行首”
- 按[gg]:进入到文本开始
- 按「G」:移动到文章的最后
- 按[num+shift+g]:光标定位到num行
- 复制、剪切(删除)、粘贴
- 「yy」:复制光标所在行到缓冲区。
- 「#yy」:例如,「6yy」表示拷贝从光标所在的该行“往下数”6行文字。
- 「dd」:删除光标所在行
- 「#dd」:从光标所在行开始删除#行
- 「p」:将缓冲区的内容粘贴到光标所在位置的下一行。
- 「#p」:将缓冲区的内容粘贴#次到光标所在位置的下一行。
- 文本修改
- 「r」:替换光标所在处的字符。
- 「#r」:批量替换光标所处字符开始往后的#个字符。
- 「R」:进入替换模式,替换光标所到之处的字符,直到按下「ESC」键为止。
- 「x」:剪切(删除)光标所在处的字符,多次按x会不断往后替删。
- 「#x」:批量剪切(删除)光标所处字符开始往后的#个字符。
- 「X」:剪切(删除)光标所在处前面的字符,多次按x会不断往前替删。
- 「#X」:批量剪切(删除)光标所在处的前面#个字符。
- 「 ~ 」:将光标所在处字符进行大小写替换。按多次 ~ 会不断往后替换。
- 撤销与重做
- 「u」:如果误执行一个命令,可以按下 u ,回到上一个操作。
- 「ctrl + r」: 撤销的恢复
4. vim末行模式命令集
附:正常模式按「:」即可进入末行模式。
- 保存、离开文件
- 「w」: 保存。
- 「w!」: 强制保存。
- 「q」: 退出。
- 「q!」: 强制退出。
- 「wq」: 保存并退出。
- 「wq!」: 强效保存并退出。
- 批量化替换
- %s/test/TEST/g: 进行批量化替换,(后者替换前者)。即:TEST 替换 test。
- 感叹号+指令
- 在底行,感叹号!后面可以跟任何命令。
- eg:
!gcc filename.c —> 在底行直接对filename.c进行编译。
!./a.out —> 不退出vim,在底行直接将编译结果运行
- 列出行号 + 跳到文件中的某一行
- 「set nu」: 会在文件中的每一行前面列出行号。
- 「num」: 冒号后输入一个数字 num ,回车就会跳到该行。
- 查找字符
- 「 /关键字」: 回车会将所有关键词高亮出来,按「n」会向下查找。
- 「?关键字」: 回车会将所有关键词高亮出来,按「n」会向上查找。
- 多窗口
- 「vs」: vs + filename,左右filename的分屏。
- 「ctrl + 双击w」: 分屏窗口的切换。
5. vim操作总结
6. 简单vim配置
vim配置极其麻烦,接下来是一些原理。最后会引用一个大佬的自动配置方法。(推荐使用,也可以自己配置)
- 配置文件的位置
- 在目录 /etc/ 下面,有个名为vimrc的文件,这是系统中公共的vim配置文件,对所有用户都有效。
- 而在每个用户的主目录下,都可以自己建立私有的配置文件,命名为:“.vimrc”。例如,/root目录下,通常已经存在一个.vimrc文件,如果不存在,则创建之。
- 切换用户成为自己执行 su ,进入自己的主工作目录。
- 打开自己目录下的.vimrc文件,自己写入配置。(自己写入配置)
- 常用配置选项
- 设置行号 — set nu
- 设置下划线 — set cursorline
- 设置自动锁紧 — set autoindent
- 设置缩进的空格数为4: set shiftwidth=4
- 设置c 风格缩进 — set cindent
- 自动补全括号:
inoremap ( ()i
inoremap [ []i
inoremap i
inoremap < <>i - 高亮匹配括号 — hi MatchParen ctermbg=blue ctermfg=white
- 高亮匹配括号 — :NoMatchParen
- 如果要再开启,可以用 — :DoMatchParen
- 如果要更改颜色,可以用hi,例如: — :hi MatchParen ctermbg=blue ctermfg=white
- 使用插件
- 安装TagList插件,下载taglist_xx.zip ,解压完成,将解压出来的doc的内容放到~/.vim/doc, 将解压出来的plugin下的内容拷贝到~/.vim/plugin
- 在~/.vimrc 中添加: let Tlist_Show_One_File=1 let Tlist_Exit_OnlyWindow=1 let Tlist_Use_Right_Window=1
- 安装文件浏览器和窗口管理器插件: WinManager
- 下载winmanager.zip,2.X版本以上的
- 解压winmanager.zip,将解压出来的doc的内容放到~/.vim/doc, 将解压出来的plugin下的内容拷贝到~/.vim/plugin
- 在~/.vimrc 中添加 let g:winManagerWindowLayout=‘FileExplorer|TagList nmap wm :WMToggle
- 然后重启vim,打开~/XXX.c或~/XXX.cpp, 在normal状态下输入"wm", 你将看到上图的效果。更具体移步:点我, 其他手册,请执行vimtutor命令。
- 安装方法:(大佬的)
支持环境
目前只支持 Centos7 x86_64. 后面会考虑 Ubuntu 等发行版的支持.
安装方法
在 shell 中执行指令(想在哪个用户下让vim配置生效, 就在哪个用户下执行这个指令. 强烈 “不推荐” 直接在 root 下执行):
curl -sLf https://gitee.com/HGtz2222/VimForCpp/raw/master/install.sh -o ./install.sh && bash ./install.sh
注:
引用自:https://gitee.com/HGtz2222/VimForCpp?_from=gitee_search#%E5%AE%89%E8%A3%85%E6%96%B9%E6%B3%95
7. 更深入可以去参考
Linux开发工具 — 编译器-gcc/g++使用
1. 背景知识
2. gcc如何完成
格式: gcc [选项] 要编译的文件【选项】[目标文件]
- 预处理(进行宏替换等)
- 预处理功能主要包括:宏定义,文件包含,条件编译,去注释等。
- 预处理指令是以#号开头的代码行 (头文件、宏等)。
- 实例: gcc –E hello.c –o hello.i
- 选项“-E”,该选项的作用是让 gcc 在预处理结束后停止编译过程。
- 选项“-o”是指目标文件, “.i”文件为已经过预处理的C原始程序。
- 编译(生成汇编)
- 编译功能主要包括:检查代码的规范性、检查是否有语法错误等,检查无误后 gcc 会把代码翻译成汇编语言 (.s文件)。
- 选项“-S”,该选项的作用是让 gcc 只进行编译而不进行汇编。编译结束会生成汇编代码。
- 实例: gcc –S hello.i –o hello.s
- 汇编(生成机器可识别的代码)
- 汇编阶段是把编译阶段生成的 .s文件转成 .o文件。
- .o文件即:目标文件 也叫 目标二进制
- 选项“-c”,该选项的作用是让 gcc 汇编结束后停止编译过程。代码已转化为“.o”的二进制目标代码了。
- 实例: gcc –c hello.s –o hello.o
- 连接(生成可执行文件或库文件)
- 在成功编译之后,就进入了链接阶段。
- 完成链接后会生成可执行文件.out 。
- 实例: gcc hello.o –o hello
- 函数库的概念:
- 我们的C程序中,并没有定义“printf”的函数实现,且“stdio.h”中也只有该函数的声明,而没有定义函数的实现,那么是在哪里实“printf”函数的呢?
- 答案是:系统把这些函数实现都被做到名为 libc.so.6 的库文件中去了,在没有特别指定时,gcc 会到系统默认的搜索路径“/usr/lib”下进行查找,也就是链接到 libc.so.6 库函数中去,这样就能实现函数“printf”了,而这也就是链接的作用
- 函数库一般分为静态库和动态库两种。
- 静态库是指编译链接时,把库文件的代码全部加入到可执行文件中,因此生成的文件比较大,但在运行时也就不再需要库文件了。静态库后缀名一般为“.a”
- 动态库在编译链接时并没有把库文件的代码加入到可执行文件中,而是在程序执行时由运行时链接文件加载库,这样就节省了系统的开销,因此生成的文件比较小。动态库一般后缀名为“.so”。
- gcc 在编译时默认使用动态库。如前面所述的 libc.so.6 就是动态库。
- gcc选项
- -E 只激活预处理,这个不生成文件,你需要把它重定向到一个输出文件里面
- -S 编译到汇编语言不进行汇编和链接
- -c 编译到目标代码
- -o 文件输出到文件
- -static 此选项对生成的文件采用静态链接
Linux开发工具 — 调试器-gdb使用
1. 背景
- 程序的发布方式有两种,debug模式和release模式
- Linux gcc/g++出来的二进制程序,默认是release模式
- 要使用gdb调试,必须在源代码生成二进制程序的时候, 加上 -g 选项
2. 开始使用
- 打印源代码:
- list或l 行号:显示源代码,回车接着上次的位置往下列,每次列10行。
- list或l 函数名:列出某个函数的源代码。
- 退出gdb:
- 退出gdb: ctrl + d 或 quit 或 q
- eg:
- 断点的相关操作:
- break(b) 行号:在某一行 设置断点
- break 函数名:在某个函数开头 设置断点
- disable breakpoints:禁用断点。存在的意义:保留调试痕迹。
- 调试完毕或调试过程中,保留调试痕迹很重要。
- enable breakpoints:启用断点
- delete breakpoints n:删除序号为n的断点
- delete breakpoints:删除所有断点(这个时候不能简写为d)
- info break :查看断点信息。
- eg:
- 监视变量相关
- p 变量:打印变量值。
- eg
- print§:打印表达式的值,通过表达式可以修改变量的值或者调用函数
- eg:
- display 变量名:跟踪查看一个变量,每次停下来都显示它的值
- undisplay:取消对先前设置的那些变量的跟踪
- eg:
- info(i) locals:查看当前栈帧局部变量的值
- 调试相关
- r或run:运行程序,从开始连续执行程序而非单步的执行。类似F5
- continue(或c):跳到下一个断点,从当前位置开始连续执行程序而非单步的执行。类似F5
- r或run 和 continue(或c)配合相当于F5。
- break(b) 行号:打断点,在某一行设置断点。相当于F9
- n 或 next:逐过程,单步执行。相当于F10
- s或step:逐语句,可进入函数调试。相当于F11
- 定位问题最常用的三个命令:
- continue(或c):跳到下一个断点,从当前位置开始连续而非单步执行程序
- until X行号:跳转到对应的X行。可直接在函数内跳转到对应的X行
- finish:把当前在跑的函数跑完,然后就挺下来等待命令
- 修改变量的值
- set var:修改变量的值
- 查看各级函数调用及参数
- breaktrace(或bt):查看各级函数调用及参数
Linux开发工具 — 项目自动化构建工具-make/Makefile使用
1、背景
- 一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作
- makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。
- make是一个命令工具,是一个解释makefile中指令的命令工具,一般来说,大多数的IDE都有这个命令,比如:Delphi的make,Visual C++的nmake,Linux下GNU的make。可见,makefile都成为了一种在工程方面的编译方法。
- make是一条命令,makefile是一个文件,两个搭配使用,完成项目自动化构建。
2、依赖方法、依赖关系
光有依赖关系是不够的,还需要依赖方法。
3、理解
操作步骤:
- 创建Makefile文件:
- touch Makefile
- 写文件:
- make clean—>执行clean
- make mytest—>执行mytest
- make—>默认执行mytest
- 原因:makefile在自下而上进行目标文件扫描生成时,默认生成第一个可执行程序中之后就不往后生成了,即:Makefile默认只会生成一个目标文件
- 保存退出:
- ctrl + d 或 quit 或 q
4、原理
- make会在当前目录下找名字叫“Makefile”或“makefile”的文件。
- 如果找到,它会找文件中的第一个目标文件,在上面的例子中,他会找到“mytest”这个文件,并把这个文件作为最终的目标文件。
- 如果mytest文件不存在,或是mytest所依赖的后面的mytest.c文件的文件修改时间要比mytest这个文件新,他就会执行后面所定义的命令来生成mytest这个文件。
- 如果mytest所依赖的mytest.c文件不存在,那么make会在当前文件中找mytest.c文件的依赖关系及文件,如果找到则再根据规则生成mytest.c文件。
- 这就是整个make的依赖性,make会一层又一层地去找文件的依赖关系,直到最终编译出第一个目标文件。
- 在找寻的过程中,如果出现错误,比如最后被依赖的文件找不到,那么make就会直接退出,并报错。
5、项目清理
- 工程是需要被清理的
- 一般我们这种clean的目标文件,我们将它设置为伪目标,用 .PHONY 修饰,伪目标的特性是,总是被执行的。
Linux第一个小程序-进度条
回车vs换行vs回车换行
- 回车(\\r):光标回到当前行行首,但不会换到下一行。如果接着输出的话,本行以前的内容会被逐一覆盖。
- 换行(\\n):换到当前位置的下一行,而不会回到行首。
- 回车并换(\\r\\n):换到下一行并回到行首。
- C语言中及大部分情况下,\\n代表的是回车并换行。
行缓冲区概念
- 观察以下两段代码的执行结果,为什么?
- <1>
printf("hello bit\\n");
sleep(5);
-
结果:打印—>停五秒—>结束
-
<2>
printf("hello bit\\r");
sleep(5);
- 结果:停五秒—>打印—>结束
- 原因:<2>情况sleep时print已经执行了,但print执行了并不代表信息会被打印到屏幕上。
- 刷新概念:把数据真正写入磁盘、文件、显示器、网络等设备或文件中去。
- 解决:fflush(stdout); //强制刷新
printf("hello bit\\r");
fflush(stdout); //强制刷新
sleep(5);
输入输出
倒计时小程序
#include<iostream>
using namespace std;
#include<Windows.h>
#include<WinBase.h>
int main()
for (int i = 9; i >= 0; i--)
printf("%2d\\r", i);
Sleep(1000);
return 0;
- printf("%2d\\r", i); //%2d表示输出时的位宽按2字符输出
进度条小程序:
相关练习:
以上是关于Linux环境 基础开发工具使用的主要内容,如果未能解决你的问题,请参考以下文章