Linux开发工具使用

常用工具:

软件包管理工具:yum
编程相关工具:vim、gcc/g++、gdb
项目相关工具:make/Makefile、git
查看软件包:yum list/grep key
安装软件包:yum install package_name
删除软件包:yum remove package_name

编译器:vim

vim中的操作模式共12种,常用的有3种。
普通模式:主要是指用命令进行文件内容操作
控制屏幕光标的移动,字符、字或行的删除,移动复制某区段及进入Insert mode下,或者到 last line mode

插入模式:插入数据
只有在Insert mode下,才可以做文字输入,按「ESC」键可回到命令行模式。该模式是我们后面用的最频繁的编辑模式

底行模式:用于文件内容的保存和退出
文件保存或退出,也可以进行文件替换,找字符串,列出行号等操作。 在命令模式下,shift+: 即可进入该模式。要查看你的所有模式:打开vim,底行模式直接输入

模式切换:

普通->插入:i a o I A O
插入->普通:ESC键(所有模式切换至普通均适用该方式)
i:从光标所在位置开始插入
a:光标向后移动一个字符开始插入
o:光标所在行下方增加新行开始出入
I: 光标移动到行首开始插入
A: 光标移动到行尾开始插入
O:光标所在行上方添加新行开始插入
普通->底行:输入:
:w(保存当前文件)
:q(退出)
:wq(保存并退出)
:q!(强制退出)

普通模式下的命令操作:

插入模式:

  1. 按「i」切换进入插入模式「insert mode」,按“i”进入插入模式后是从光标当前位置开始输入文件;
  2. 按「a」进入插入模式后,是从目前光标所在位置的下一个位置开始输入文字;
  3. 按「o」进入插入模式后,是插入新的一行,从行首开始输入文字。
光标移动操作:
  1. 「h」、「j」、「k」、「l」,分别控制光标左、下、上、右移一格
  2. 按「G」:移动到文章的最后
  3. 按「 $ 」:移动到光标所在行的“行尾”
  4. 按「^」:移动到光标所在行的“行首”
  5. 按「w」:光标跳到下个字的开头
  6. 按「e」:光标跳到下个字的字尾
  7. 按「b」:光标回到上个字的开头
  8. 按「#l」:光标移到该行的第#个位置,如:5l,56l
  9. 按[gg]:进入到文本开始
  10. 按[shift+g]:进入文本末端
  11. 按「ctrl」+「b」:屏幕往“后”移动一页
  12. 按「ctrl」+「f」:屏幕往“前”移动一页
  13. 按「ctrl」+「u」:屏幕往“后”移动半页
  14. 按「ctrl」+「d」:屏幕往“前”移动半页
对文件内容操作:
  1. 「yy」:复制光标所在行到缓冲区。
  2. 「 nyy」 :从光标所在航开始向下复制n行数据
  3. 「p」:向光标所在行下方进行粘贴。注意:所有与“y”有关的复制命令都必须与“p”配合才能完成复制与粘贴功能
  4. 「 P」:项光标所在行上方进行粘贴。
  5. 「dd」:删除光标所在行
  6. 「ndd」:从光标所在行开始删除n行
  7. 「dw」:删除光标所在单词
  8. 「x」:每按一次,删除光标所在位置的一个字符
  9. 「u」:回到上一个操作
  10. 「ctrl + r」: 撤销的恢复
  11. 「gg=G」:全文对齐
底行模式操作:
  1. 「set nu」: 输入「set nu」后,会在文件中的每一行前面列出行号
  2. 「#」:「#」号表示一个数字,在冒号后输入一个数字,再按回车键就会跳到该行
  3. 「/关键字」: 先按「/」键,再输入您想寻找的字符,如果第一次找的关键字不是您想要的,可以一直按「n」会往后寻找到您要的关键字为止
  4. 「?关键字」:先按「?」键,再输入您想寻找的字符,如果第一次找的关键字不是您想要的,可以一直按「n」会往前寻找到您要的关键字为止
  5. 「w」: 在冒号输入字母「w」就可以将文件保存起来

编译器:gcc/g++

功能:将高级语言解释成机器可识别的指令

  1. 预处理:展示所有代码 gcc-E
    预处理功能主要包括宏定义,文件包含,条件编译,去注释等。
    预处理指令是以#号开头的代码行。
    选项“-E”,该选项的作用是让 gcc 在预处理结束后停止编译过程。
    选项“-o”是指目标文件,“.i”文件为已经过预处理的C原始程序。
    实例: gcc –E hello.c –o hello.i

  2. 编译:进行语法语义纠错。若无错误,则将程序解释为汇编语言 gcc-S
    在这个阶段中,gcc 首先要检查代码的规范性、是否有语法错误等,以确定代码的实际要做的工作,在检查无误后,gcc 把代码翻译成汇编语言。
    用户可以使用“-S”选项来进行查看,该选项只进行编译而不进行汇编,生成汇编代码。
    实例: gcc –S hello.i –o hello.s

  3. 汇编:将会汇编语言解释成为二进制机器指令 gcc-C
    汇编阶段是把编译阶段生成的“.s”文件转成目标文件
    读者在此可使用选项“-c”就可看到汇编代码已转化为“.o”的二进制目标代码了
    实例: gcc –c hello.s –o hello.o

  4. 链接:将所有的.o文件和库文件进行打包,最终成为一个可执行程序
    在成功编译之后,就进入了链接阶段。
    实例: gcc hello.o –o hello

库文件:封装的函数所打包的一个代码文件

链接方式:动态链接,静态链接。

1.动态链接——链接动态库
在可执行程序添加库中的函数符号信息表,生成的可执行程序比较小。因为并没有把函数的实现直接加入到可执行程序中。因此运行程序的时候需要依赖动态库的存在。但是在内存中多个程序可以共用相同库。从而降低了代码冗余。动态库一般后缀名为“.so”

2.静态链接——链接静态库
在生成可执行程序时,直接将库中的所有代码实现都写入到了可执行程序中。生成的可执行程序比较大。在运行程序时,若多个程序都静态链接了同一个库文件,会在内存中造成代码冗余。但静态链接的程序运行时不依赖库存在。其后缀名一般为“.a”

gcc的默认链接方式:动态
在生成可执行程序时默认连接标准c库。

调试器:gdb

1.调试的前提:debug版本的程序
gcc默认生成release版本程序,因此要在编译程序时使用gcc-g生成debug程序
程序调试:

1.gdb加载程序符号信息

gdb./main gdb->file main

2.流程控制指令

run:直接运行程序
start:开始调试
list:查看调试行附近代码 list file:line
until:直接运行到指定行 until file:line
next:下一步(直接运行)
strp:下一步(跟踪进入函数)
continue:从当前位置开始运行程序

3.断点相关指令

break:在某一行设置断点
break file:line:给指定函数指定行打断点
break func_name: 给指定函数开头打断点
info break:查看断点信息
delete break id:删除指定(序号为id)断点
delete break:删除所有断点
watch variable_name:给变量打断点

4.其它指令

quit:退出gdb
breaktrace(或bt):查看各级函数调用及参数
print(p):打印表达式的值,通过表达式可以修改变量的值或者调用函数

自动化构建工具:make/Makefile

1.Makefile:普通的文本文件-记录项目的构建流程规则
make:Makefile解释器-逐行解释Makefile中的项目构建规则,完成项目的构建

Makefile的编写规则:

目标对象:依赖对象
\t 要执行的指令

目标对象:要生成的可执行程序名称
依赖对象:源码文件 通过对目标对象的最后一次修改时间判断,目标对象是否需要重新生成

预定义变量:
$^ 表示所有的依赖对象
$@ 表示目标对象
$< 第一个依赖对象
.PHONY:声明伪对象—不管对象是否最新、是否存在,每次都需要重新生成(通常用于声明clean)

make的解释执行规则:

1.make在Makefile中只寻找第一个目标对象进行生成,生成完毕则退出
2.在生成目标对象之前,先判断依赖对象是否需要生成(先找依赖对象的生成规则,)

//声明一个伪对象:
.PHONT :main
//生成可执行程序:
main:main.o  child.o 
gcc $^ -0 $@
//通配所有的.o的生成规则:
%.o:%.c

最简单:

main:main.c child.c
gcc $^ -0 $@
.PHONY:clean
clean:
      rm -f  main

升级版:

main:main.o  child.o 
gcc $^ -0 $@
%.o:%.c
gcc $^ -0 $@

.PHONY:clean
clean:
      rm -f  main
wildcard:获取当前路径下以.c结尾的文件名
src=$(wildcard ./*.c)
字符替换 将变量内容中的后缀名 从.c修改为.o赋值给obj
obj=$(patsubsr %.c,%.o,$(src))
make工作原理:

当我们只输入make命令时:

  1. make会在当前目录下找名字叫“Makefile”或“makefile”的文件。
  2. 如果找到,它会找文件中的第一个目标文件(target),在上面的例子中,他会找到“hello”这个文件,并把这个文件作为最终的目标文件。
  3. 如果hello文件不存在,或是hello所依赖的后面的hello.o文件的文件修改时间要比hello这个文件新(可以用 touch 测试),那么,他就会执行后面所定义的命令来生成hello这个文件。
  4. 如果hello所依赖的hello.o文件不存在,那么make会在当前文件中找目标为hello.o文件的依赖性,如果找到则再根据那一个规则生成hello.o文件。(这有点像一个堆栈的过程)
  5. 当然,你的C文件和H文件是存在的啦,于是make会生成 hello.o 文件,然后再用 hello.o 文件声明make的终极任务,也就是执行文件hello了。
  6. 这就是整个make的依赖性,make会一层又一层地去找文件的依赖关系,直到最终编译出第一个目标文件。
  7. 在找寻的过程中,如果出现错误,比如最后被依赖的文件找不到,那么make就会直接退出,并报错,
    而对于所定义的命令的错误,或是编译不成功,make根本不理。
  8. make只管文件的依赖性,即,如果在我找了依赖关系之后,冒号后面的文件还是不在,那么对不起,我就不工作啦。

项目的版本管理工具:git–分布式管理工具

这里涉及到github的使用。个人认为gethub是一个非常好用的软件。

  1. 从服务器上克隆一个仓库
  2. 添加修改的文件
  3. 进行本地提交
  4. 同步到服务器
int main()
{
int i=0;

for(i=0;i<10;i++)
{
//针对标准输出:换行符不仅有换行的作用,还有刷新缓冲区的作用
//\r是回车符 将光标移动到行首

printf("-");
//fflush刷新文件缓冲区
fflush(stdout);
sleep(1);
}
return 0;
}

其他常用的编辑器之间的横向对比以及编辑器之间的区别和优缺点

  1. Vim
    Vim是从 vi 发展出来的一个文本编辑器。代码补完、编译及错误跳转等方便编程的功能特别丰富,在程序员中被广泛使用。和Emacs并列成为类Unix系统用户最喜欢的编辑器。

  2. Eclipse
    Eclipse是一款很酷的开源代码编辑器,它拥有代码高亮和智能提示等强大的功能。在Eclipse中,完全胜任以下编程语言的工作——Python, R, Ruby, JavaScript, Natural, Lasso, C, C++, COBOL, Scheme, Clojure, Groovy等等,它也是Java集成开发环境,甚至提供了对Java 8的支持。在一些Web开发IDE特性的帮助下,你可以非常方便地对代码文件进行组织和访问。

  3. Brackets
    Brackets也是一款为Linux开发者设计的开源代码编辑器,使用Brackets写代码,你不会被任何事情所打断。比如在写HTML代码时,即便你没有保存代码也可以及时预览你的Web页面效果。你也可以使用Theseus来检查变量,Brackets默认提供一种主题,当然你也可以在扩展中心获取更多的主题。

  4. Emacs
    Emacs不仅仅是一个编辑器,他是一个整合环境,或可称它为集成开发环境,这些功能如让使用者置身于全功能的操作系统中。Emacs不仅可以作为文本编辑器,还可以用来收发电子邮件、通过FTP/TRAMP编辑远程档案、通过Telnet登录主机、上新闻组、登陆IRC和朋友交流、查看日历等功能。

  5. Light Table
    LightTable是一个免费开放源代码的编辑器,该编辑器有一个非常干净的界面,并有大量扩展。它与Windows、Mac和Linux都兼容,是高度可定制的。使用Light Table,开发者只需打开一个浏览器窗口即可实时查看更改,并且支持不同的嵌入。

  6. Chocolat
    Chocolat本身是Mac OS X的最佳代码编辑器。该编辑器旨在与OS无缝集成,Chocolat为JS、Python和HTML提供拖放功能、拆分编辑、代码折叠和代码完成。

  7. Sublime Text
    一个紧凑但性能较高的代码编辑器一个跨平台的代码编辑器,适用于所有WordPress项目。 Sublime Text有很多功能可以提供: 脚本编程、自定义界面、常规文件切换、合成和错误检测、多媒体选择和编辑、外部插件集成、Themes

彩色进度条:(蓝底红色#)

test:test.c                                                                                                
  gcc -o test test.c                                                                                      
.PHONY:clean                                                                                               
clean:                                                                                                     
  rm -f test       
vim test.c

#include <stdio.h>                                                                                         
#include <unistd.h>                                                                                        
#include<string.h>                                                                                         
int main()                                                                                                 
{
                                                                                                              
    int i = 0;                                                                                             
    char bar[101];                                                                                         
    const char *lable = "|/-\\";                                                                           
    for(i=0;i<=100;i++)                                                                                    
    {
                                                                                                              
        bar[i]='\0';                                                                                       
        printf("\033[1;31;44m%s\033[0m [%d%%][%c]\r",bar,i,lable[i%4]);                                    
        fflush(stdout);                                                                                    
        bar[i]='#';                                                                                        
        usleep(100000);                                                                                    
    }                                                                                                      
    printf("\n");                                                                                          
    return 0;                                                                                              
}              

rpm和yum的区别:

  1. rpm安装
    rpm安装:安装别人编译好的软件包
    rpm即Redhat Package Manager,Redhat的软件包管方式,适用rpm install 命令
    rpm不仅已经把软件源代码编译成二进制文件,而且对软件包依赖的文件,系统环境等做了统计文件扩展名:rpm
    还有一种SRPM:没有编译成二进制文件,但是也包含rpm的特性

  2. yum安装
    用rpm方式安装软件,如果依赖的软件没有事先安装,软件无法安装成功。
    为了解决这个问题,推出yum方式。
    既然依赖的软件没有安装在机器上,那么就先安装依赖文件,再安装我需要安装的软件。
    因此yum在安装软件同时安装依赖文件。
    因此需要一个yum源来放依赖的软件源,对比被安装机器上rpm软件库归根到底,yum也是基于rpm的。

发布了37 篇原创文章 · 获赞 3 · 访问量 1082

猜你喜欢

转载自blog.csdn.net/weixin_43264873/article/details/103226194