Linux下的常用开发工具

软件包管理工具

yum–类似于手机上的应用商店(管理当前系统中能够安装的工具以及卸载的工具,并且实现安装及卸载操作)
1、查看所能安装的软件:yum list 查看所有工具;yum search keyword 根据关键字查找指定的工具
2、安装一个指定的权健工具:yum install package_name
3、卸载已经安装的软件工具:yum remove package_name
推荐下载工具 gcc、gcc-c++、gdb、git、lrzsz

lrzsz工具:rz从主机传文件到传到虚拟机当前路径;sz filename将filename文件传输到主机中

编辑器

在linux下有很多编辑器,最常用的是vim
vim test.txt 打开test.txt文件
vim中默认不能使用鼠标,所以只能通过键盘完成;因此为了完成各种各样的操作(复制粘贴,数据修改…),因此vim分出了多种操作模式,不同的操作模式下,相同的按键有不同的功能。

vim操作模式分类:共有12种,最常用的是三种–普通插入底行
普通模式:完成文本的操作,以及光标的移动操作,其他指令操作。
插入模式:插入数据
底行模式:我们这里更多用于保存退出文件

模式切换:vim filename 打开文件后,默认处于普通模式
普通–>插入 按i光标在哪就从哪里插入;按o在光标所在行新建一行插入;
插入–>普通 ESC键盘左上角 (任意模式下按ESC键都可以回到普通模式下)
普通–>底行 按:(英文冒号)常用操作 w 保存 q退出 wq保存并退出 q! 不保存强制退出 (用于打开并修改了只读文件)

普通模式下的常用操作:
光标移动操作:hjkl-左下上右 ctlr+f/b-向下/上翻页 gg/G-文档首行和末尾行 $-移动到光标所在行末尾
文本内容操作:yy / nyy-复制当前行/复制n行 p / np粘贴一次 / 粘贴n次 dd / ndd剪切光标所在行 / 剪切n行 x删除光标所在字符 dw删除单词
其他典型操作:u撤销上一次操作 ctrl+r反向撤销 gg=G全文对齐 set nu显示行号 /strname查找含有strname字符串所在行,n向下查找/N向上查找

vim 基本配置

输入vim ./vimrc 切换到插入模式,输入一下代码,保存并退出

   set ts=4if has("autocmd")filetype indent onautocmd FileType * setlocal ts=4 sts=4 sw=4 ai et nuautocmd FileType * setlocal ts=4 sts=4 sw=4 noet nuendif

扩展:vim打开一个文件后,通常会创建一个临时文件,以.sw*结尾,vim打开文件后,创建临时文件,编辑的时候会修改这个临时文件,只有在保存的时候,才回将修改的信息,写入到源文件中。例如打开a.txt文件,会创建一个临时文件.a.txt.swp 。注意:正常退出vim的时候会删除临时文件,在文件没有正常关闭退出vim时,这个临时文件不会被删除,会一直存,且每次打开源文件都会提示信息。这时候退出删除这个隐藏的临时文件即可。

编译器

gcc C语言编译器/ g++ C++语言编译器
在编程时所用的C、C++语言都属于高级语言,不是cpu指令,这种语言无法直接被cpu识别。而这种语言的出现的目的,是为了简化编程,并且实现扩平台移植性(一段程序能够在不同的平台上编译后运行)。上层使用统一语言的语法规则,构建不同语言,然后不同语言拥有不同的编译器,将上层高级语言代码解释为对应平台的cpu指令,能够被cpu识别执行。

编译的过程:将高级语言代码解释为机器指令经过了哪些阶段

1、预处理阶段:展开所有代码(引入头文件,宏替换,删除注释…)但不检查语义语法
gcc -E test.c -o test.i 只进行预处理阶段,并将预处理后的文件写到test.i文件中
2、编译阶段:检查语义语法规错误,如果没有错误则将C语言解释为汇编语言
gcc -S test.i -o test.s 只进行编译处理,并将编译处理后的文件写到test.s文件中
3、汇编阶段: 将汇编代码解释为二进制的cpu指令
gcc -c test.s -o test.o 只进行汇编处理,并将汇编处理后的文件写到test.o文件中
4、链接阶段: 将所有的指令代码打包到一起(不仅是打包我们自己的代码,还有链接文件中的库函数指令代码),进行组织成为可执行程序
gcc test.o -o test.exe 进行链接处理,并将链接后的文件写到test.exe文件中

在linux系统下,可以直接链接然后执行可执行文件,并不是说没有前面的三个阶段。内部其实也是都经历了这四个阶段 gcc test.c -o test.exe
:通常被认为是库函数,说白了就是一个文件,文件中包含大量的函数实现(比如我们所使用的printf函数)
代码中用到了标准库中的printf函数,则生成可执行程序时就必须能够知道printf的具体指令,这就是链接库的必要性。
库分为动态库静态库

库的链接方式:gcc / g++编译器默认的链接方式是动态链接
动态链接:链接动态库生成可执行程序,并没有把库中函数的实现指令直接拿过来写入可执行程序中,而是在可执行程序中记录了库中函数的符号信息表,在运行可执行程序的时候再去加载动态库到内存中,如果动态库不存在,则程序无法运行。
静态链接:链接静态库生成可执行程序,直接将库中我们用到的函数的实现代码指令,写入到了可执行程序文件中,程序运行的时候没有什么依赖。

动态链接的优缺点:生成的可执行文件比较小,运行时态库被加载到内存中,可以多个程序使用同一份内存中库函数代码;缺点是运行时需要依赖动态库的存在,不存在则无法运行,装载速度慢。

静态链接的优缺点:程序运行没有其他依赖,可以直接运行;装载速度快,但是可执行程序比较大,并如果多个程序使用同一个库中的函数,则这个函数的代码在运行时内存就会有多份相同的库函数代码,会造成冗余。

gdb调试器

调试器的功能:调试,观察程序的运行过程,排查程序的运行错误。
程序的错误分类:编译错误,链接错误,运行时错误(代码逻辑不对及运行时崩溃)。
我们大家在windows都用过vs吧,我们调试都是直接按F10,F11。但是并不是所有情况下都可以调试,程序分为debug版本和release版本,debug是不对进行优化,并且假如了程序调试信息,而release不包含调试信息,会对程序进行优化。vs中默认是debug版本,而在linux下默认是release版本。如果我们想在linux下调试程序,那么我们必须将程序改为debug版本,在链接时在文件前加-g
示例:gcc -g test.c -o test.exe
在linux下我们的调试工具就是gdb调试器,下面我们来了解它。
gdb常用调试指令
流程控制
gdb ./test.exe 进入调试
quit退出调试
run 直接运行程序 简写r
start 开始逐步调试
list查看调试行附近代码 list nn为行号,查看第n行附近代码 list file : n 查看文件file的第n行附近代码 简写l
next逐过程,遇到函数直接运行完毕 简写n
step逐语句,遇到函数会进入函数 简写s
until n直接运行到第n行的位置 ,until file :n运行到文件file的第n行
continue从当前调试位置直接运行,直到断点或者程序运行完毕 简写c
break n打断点 break file : n在文件file的第n行打断点 break funtion_name在函数第一行打断点 简写b
info break 查看断点信息 i b
delete 删除全部断点 delete n删除断点ID为n的断点 简写d
watch variable_name变量监控断点,当变量发生改变时停下来

内存控制
print var_name 查看变量内容 print var_name=val设置变量内容 简写p
backtrace查看函数调用栈–通常用于检测程序运行时崩溃位置 简写b 栈顶位置就是程序崩溃的位置

项目自动化构建工具make/Makefile

Makefile:是一个文本文件,记录一个项目的构建规则流程
make:是一个解释程序,对Makefile记录的构建规则流程逐步解释执行,完成项目的构建

Makefile的编写规则:

目标对象:依赖对象
[缩进]  生成目标对象的指令
test : test.cgcc test.c -o test

在命令行中敲击make指令,则表示运行make解释程序,程序会在当前目录下找到名称为makefile的文件,解释执行其中的项目构建规则。
预定义变量的使用:用于指令中
$@ 表示目标对象
$^ 表示所有依赖对象
$< 表示依赖对象的第一个

test : test.c test1.c test2.cgcc $^ -o $@上述指令等价于gcc test.c test1.c test2.c -o test

在规则中,找到要生成的以第一个目标对象(判断目标对象是否已经存在,存在的话是否需要重新生成,根据依赖文件的最后一次修改时间最对比)然后执行对象生成的指令。
$(wildcard ./*.c) 获取当前目录下所有以,c结尾的文件的文件名称
$()对括号内的变量的使用

src=$(wildcard ./ *.c)
test : $(src)gcc $^ -o $@
与上一例子代码功能一样

程序的编译过程有4部分:预处理,编译,汇编,链接。而在项目构建中整体会分为两步—编译与链接。好处是如果值修改了一个.c文件,就不用全部文件都编译,以前是直接对所有.c文件进行编译生成可执行程序,效率低下。因此分为两步进行操作,先把每个.c文件生成自己的.o文件,然后再把所有的.o文件链接到一起,一旦一个.c文件改变,只需要对这个.c文件进行编译生成.o文件,重新链接一次就可以生成可执行文件(其他文件不需要编译)

test.o : test.cgcc -c $^ -o $@
test1.o : test1.cgcc -c $^ -o $@
test2.o : test2.cgcc -c $^ -o $@
test : test.o test1.o test2.ogcc $^ -o $@

make每次在makefile中只会找到第一个目标对象进行生成,生成之后就会推出(也就是不会去生成第二个目标对象)如果按以上代码,则只会生成test.o文件,并不会生成test1.o test2.o test文件。但是修改成一下代码,就可以正确生成我们想要的代码:

test : test.o test1.o test2.ogcc $^ -o $@
test.o : test.cgcc -c $^ -o $@
test1.o : test1.cgcc -c $^ -o $@
test2.o : test2.cgcc -c $^ -o $@

将最后一步链接的指令放到第一个对象的位置,在生成目标对象时,会去查找依赖对象的生成规则,先生成依赖对象,再去生成目标对象。以上代码还可以进行优化:

test : test.o test1.o test2.ogcc $^ -o $@
%.o : %.c    百分号为通配符,匹配所有以.o / .c结尾的文件gcc -c $^ -o $@

obj=$(patsubst &.c, &.o, $(src))将src变量的内容中的.c替换为.c文件,然后存放到obj变量中,但是src中的变量并没有改变

//找到所有的.c文件
src=$(wildcard ./ *.c)
//将.c文件改为.o文件
obj=$(patsubst %.c, %.o, $(src))
//发现目录下没有.o文件,就会去生成规则里查看其他对象是否可以生成
test : $(obj)gcc $^ -o $@
%.o : %.c   gcc -c $^ -o $@
与上一代码等价

.PHONY伪对象,声明一个目标对象与外部文件无关,表示每次这个对象不管是否最新都要重新生成,都会执行该语句.

.PHONY : clear
clear:rm -rf test
//使用方式
make clear

git项目版本管理工具

我之前写过在windows下如何使用git工具,也详细讲解了git的定义与功能,超详细解决git的上传和下载。在这里我就讲解一下在linux环境下如何使用git。
0、首先我们必须在github上有自己创建一个仓库(如何创建已在上面链接博客中有讲)

1、在linux下安装git工具yum install git
不确定是否已经安装,可以先查看git版本号git --version,如果出现版本号,则说明已经安装。

2、初始化空仓库到当前目录下的.git目录下 git init

3、如果第一次在linux下使用git,需要配置邮箱和用户名
git config --global user.email "your e-mail address"
git config --global user.name"your name"
4、添加本次所修改的文件 git add --all ./ 或者git add ./file_name

5、提交修改信息,进行本地版本管理 git commit -m " message"-m后面添加的是这次版本提交的信息

6、将本次信息同步到远程仓库中 git remote add origin 远程仓库地址 红框地址为第0步创建仓库时的地址

7、将本地版本同步到远程仓库 git push -u origin master

提交成功后可以发现我们github上就有了我们上传的文件

克隆远程仓库到本地linux下 git clone 远程仓库地址

假如我们想提交修改过的文件或删除过文件的目录到远程仓库,只要执行上面的 4 5 7 步骤即可

在我们工作中,远程仓库时我们公司的一个代码仓库,而我们每个人都会有一个远程仓库子分支,而这个子分支是远程仓库的一个拷贝,把这个仓库作为自己的主分支。在远程仓库中主分支上都是最基础的备份,通常都是自己分支部分的模块代码没问题了,再合并到主分支上。这样子就可以提高了我们的工作效率。

Linux 10分钟掌握Linux常用开发工具及编译的四个过程相关推荐

  1. go linux 开发工具,golang的基础语法和常用开发工具详解

    golang的基础语法 golang的基础语法和其他语言大部分都差别不大,如果我们有学习过其他语言,比如JavaScript,php,java,python等,有其他语言的语法基础,那么我们学习gol ...

  2. Drupal常用开发工具(一)——Devel模块

    2019独角兽企业重金招聘Python工程师标准>>> 进行 Drupal 开发时有许多模块和工具可供使用,其中最常用的两项便是 Devel 及 Drupal for Firebug ...

  3. Java程序员常用开发工具有哪些?

    Java程序开发人员可以选择集成开发环境IDE(IntegratedDevelopmentEnvironment),因为Java是一种开放源码语言.开放源代码免费,商业收费.怎样选择一种适合自己的集成 ...

  4. Java新手看招 常用开发工具介绍

    Java新手看招 常用开发工具介绍 Java的应用越来越广泛,学习Java的人也越来越多.学过程序设计的人知道,使用Basic进行程序设计,可以使用QBasic.Visual Basic等开发工具:使 ...

  5. 第二章 java常用开发工具以及程序的编写

    2019独角兽企业重金招聘Python工程师标准>>> 第二章 java常用开发工具以及程序的编写 1. 程序的概念         2. java程序的开发的三个步骤        ...

  6. SharePoint 2013常用开发工具分享

    众所周知,一款好的开发工具不仅能提高项目开发效率,而且能够协助开发人员简化开发流程.本文汇总几款SharePoint 2013开发常用开发工具,希望能够对大家有所帮助.如果您有更好的工具,没有包含在本 ...

  7. html5网页制作代码_好程序员HTML5大前端常用开发工具大集合

    好程序员HTML5大前端分享常用开发工具大集合HTML5作为当前最为流行的编程语言,广为适用.语言的使用人数急剧增长,更多地开发人员使用这种语言来创建各种内容并放到互联网上.随着每一个新版本的发布,H ...

  8. Drupal常用开发工具(二)——Drupal for Firebug

    2019独角兽企业重金招聘Python工程师标准>>> Drupal 的开发工具有很多,除了<Drupal常用开发工具(一)--Devel模块>中提到的 Devel 模块 ...

  9. iOS常用开发工具及第三方框架

    iOS开发中使用到的工具,以及为了避免重复造轮子,也为了更快.更有效的地进行开发,常常引用的第三方框架,像网络请求的AFNetworking,数据持久化的FMDB,请求提示符MJRefresh,还有数 ...

最新文章

  1. pandas读取剪切板
  2. 226. Invert Binary Tree
  3. android勾选控件_Android中CheckBox复选框控件使用方法详解
  4. 笨方法“学习python笔记之循环
  5. 数据挖掘:模型选择——线性回归
  6. terminal显示mysql_mac如何在terminal终端中操作mysql
  7. 开源好用的 Android 市场 F-Droid
  8. 图解机器学习算法(11) | LightGBM模型详解(机器学习通关指南·完结)
  9. 【嵌入式 C】广义互相关算法用FFT加速的C语言实现
  10. 《杀死一只知更鸟》哪个译本好?
  11. Oracle 只读表空间 说明
  12. androidstudio使用mac字体_给android studio安装新字体,如mac系统的monaco字体
  13. 上网课的心得体会1000字_上网课的感受作文600字
  14. 【前端css】如何实现分隔线效果(css兄弟兄弟节点样式+ ~)
  15. Android系列之Fragment(一)----Fragment加载到Activity当中
  16. @NamedEntityGraphs --JPA按实体类对象参数中的字段排序问题得解决方法
  17. python九九乘法口诀_Python打印出九九乘法口诀
  18. CSP 201803-4 棋局评估
  19. 安全测试工具BurpSuite
  20. 理解设计模式——工厂模式

热门文章

  1. java设计一个顺序表类的成员函数,用java编写一个逐个输出顺序表中所有数据元素的成员函数...
  2. 安装mysql最后一步第二个打叉_Mysql安装到最后一步时。出现start service红叉   亲朋好友帮忙指导一下!谢谢! 百...
  3. linux tcp客户端端口号,Linux网络编程--服务器客户端(TCP实现)
  4. 学习笔记(08):MySQL数据库运维与管理-03-用户权限回收
  5. 多元有序logistic回归_R语言多元Logistic逻辑回归 应用案例
  6. ViewPager子类与父类滑动冲突的情况
  7. lua 区间比较_TI-Lua 系列教程2.4.1: 条件分支
  8. 计算机等待程序关闭,教您win10系统关闭计算机弹出“等待后台程序关闭”无法关机的技巧...
  9. Android8.1源码编译实践(Mac)
  10. Jquery精准计算