0
点赞
收藏
分享

微信扫一扫

Linux系统(二)——Linux环境下的开发工具


  ? ? ? ? 接着上一篇博客,把Linux环境下常用的vim编辑器,gcc工具链,makefile和gdb等工具的使用理一理。

  一、vim编辑器

  1,工作模式

  ? ? ? ? vim是Linux常用文本编辑器。vim有两种基本工作模式:

  ? ? ? ? 命令模式:输入的字符作为命令使用,不进入被编辑的文档中。

  ? ? ? ? 编辑模式:输入的字符将修改文档的内容。

  ? ? ? ? 在命令模式下,如果输入某些编辑命令(一般切换到插入位置在光标处的编辑模式键入i),则切换到编辑模式;编辑模式下,按Esc可以切换回命令模式。

  ?命令模式分为三种:普通模式,命令行模式和选择模式。

  普通模式输入完毕就执行,不需要回车确定。普通模式下输入一个冒号则进入命令行模式。

  命令行模式:输入命令需按回车确认才执行,执行完毕后返回普通模式。

  (1)普通模式下命令分为移动光标类,滚动屏幕类、编辑类等。

  (a)移动光标类:

  

Linux系统(二)——Linux环境下的开发工具_vim

  (b)滚动屏幕类:ctrl + F 向下滚动一屏? ?ctrl + B 向上滚动一屏? ?Ctrl + U 向上滚动半屏? ?ctrl + D 向下滚动半屏

  (c)编辑类:

  

Linux系统(二)——Linux环境下的开发工具_vim_02

  (d)文件类:ZZ存盘退出

  ?在普通模式下输入小写字母v进入选择模式,输入大写字母V进入按行选择模式,按Ctrl+V组合键进入按列选择模式。

  (2)命令行模式

  :help? 查看帮助首页? ? ?:0 移动到第一行? ? :¥移动到最后一行? ?:n? 移动到第n行? ? :w保存文件? :q退出文件? :n 新建文件 :wq 保存并退出

  二、gcc工具链

  GNU/Linux系统上常用的编译工具是GCC。GCC实质上不是一个单独的程序,而是多个程序的集合,因此通常称为工具链。

  ? 1、程序编译过程:

  (a)预处理

  在这一阶段,源码中所有的预处理语句得到处理,例如

  #include语句所包含的文件内容替换掉语句本身

  所有已定义的宏被展开

  根据#ifdef #if等语句的条件是否成立取舍相应部分

  gcc预处理阶段可以生成.i文件,通过选项-E可以使编辑器在预处理结束时停止编译。例如:

  gcc -E -o? hello.i? hello.c

  (2)编译

  在这一阶段,编译器对源码进行语法分析,优化等操作,最后生成汇编代码。这是整个过程中最重要的一部。

  可以通过选项-S使GCC在进行完编译后停止,生成.s的汇编程序。例如:

  gcc -S -o hello.s hello.c

  (3)汇编

  这一阶段使用汇编器对汇编代码进行处理,生成机器语言代码,保存为后缀为.o的目标文件中。

  当程序由多个代码文件构成时,每个文件都要进行汇编工作,生成.o目标文件后,才能进行下一步链接工作。

  目标文件已经是最终程序的某一部分了,只是在链接之前还不能执行。可以通过-c选项生成目标文件:

  gcc -c -o hello.o hello.c ? ?

  (4)链接

  经过汇编后的机器码不能直接运行,为使操作系统能正确加载可执行文件,文件中必须包含固定格式的信息头。还必须与系统提供的启动代码链接起来才能正常运行,这些工作都由链接器来完成。

  gcc -o hello hello.c

  

Linux系统(二)——Linux环境下的开发工具_编辑器_03

  2、gcc的基本用法

  gcc [-Wall] [-O1..3] [-o name] file

  -Wall:打开所有警告项

  -O 设置优化级别, O0表示关闭优化功能

  -g 将调试信息编译到目标文件中

  -o name:指定输出文件的名字是name

  file:被编译(链接)的文件。

  使用举例:

  

Linux系统(二)——Linux环境下的开发工具_服务器_04

  三、make和makefile

  ?一个软件中通常包含很多文件,每次都进行编译会很麻烦而且效率低下。

  在Windows平台上的VC、VB都有工程概念,一旦建立一个工程,这些开发平台会自动地维护其中的各种文件,从而高效编译。

  在Linux中,使用make完成这一功能。

  1、makefile文件说明

  使用make工具,首先要编写makefile文件,一个makefile文件包含5个方面:

  1、具体规则? ?2、隐含规则? 3、定义变量? ? 4、指令? ?5、注释?

  2,makefile的规则:

  诸如Autoconf和Automake的工具可以自动生成makefile文件。makefile的内容核心是一系列的规则。规则的基本格式是:

  target:dependency

  ? ? ? ?(tab字符)command

  (1)target(目标):通常是要产生的文件的名称

  (2)dependency(依赖):指用来输入从而产生目标的文件。

  (3)command(命令):是make执行的动作,一个规则可以有多条命令,每个命令一行。命令行首字符是TAB

  3、makefile的实例:

  (1)实例一:

  objects = main.o mouse.o command.o display.o

  CC = gcc

  CFLAGS = -Wall -O2 -g? ? ? ? ? ? ? ?//相当于C中定义变量

  game : $(objects)? ? ? ? ? ? ? ? ? ? ? ? ?//定义game生成规则

  ? ? ? ? ? ? ?$(CC) -o edit $(objects)? ?

  main.o : defs.h? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//定义main.o生成规则,包含隐含规则

  mouse.o : defs.h command.h

  command.o : defs.h command.h

  display.o : defs.h buffer.h

  .PHONY : clean

  clean :? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //定义clean的规则,无依赖

  ? ? ? ? ? $(RM) edit $(objects) ?

  ? game的生成规则包含了规则的三个基本要素:目标、依赖、命令;main.o等规则没有命令,属于隐含规则(implicit rule)。clean规则没有依赖,不属于编译的内容,只是完成一个指定的动作。 ? ? ?

  隐含规则能够告诉make使用传统的标准方法完成任务。例如,生成一个目标文件的方法是使用C编译器编译C语言源程序,这个步骤所用到的命令基本都是相同的。使用隐含规则就无须详细指定这些命令,而make能按照文件名的后缀的变化,决定所采用的规则。 ? ? ?

  (2)实例二:

  

Linux系统(二)——Linux环境下的开发工具_linux_05

  变量是makefile中定义的名字,用来代替一个文本中的字符串 ,该文本字符串称为该变量的值。Makefile中常见预定义变量有:

  (a)CC? 默认值cc(gcc)是C编译器的名称。

  (b)CPP 默认是$(CC) -E 是C与预编译器的名称。

  (c)CXX默认值是g++,是C++编译器的名称、

  (d)RM?默认值 rm -f 是删除程序的名称。

  (f)$@ 用在生成规则中,表示当前目标。

  (g)$< 用在生成规则中,表示当前目标的第一个依赖目标。

  (h)$^ 用在生成规则中,表示当前目标的所有依赖目标。

  使用变量的方式:$(变量名)变量名只是字符时,()可省略

  常用的变量赋值操作:

  := 直接赋值,信值覆盖原来的值。

  ?= 条件赋值,如果原来无值则赋值。否则保持原来的值。

  += 加法赋值,新值附加在原来值后面。

  = 递归赋值,如果右侧包含其他变量,当这些变量的值变化时,被赋值变量的值也变化。

  4,make的用法:

  make 工具的基本用法如下:

  make [-C dir] [-f file] [target]

  -C dir:执行时进入dir目录,默认当前目录

  -f file:使用file作为makefile

  target:要完成的目标,目标在makefile中定义,默认是定义的第一个目标。

  四、gdb调试工具

  GDB是GNU的调试工具,它可以跟踪被调试的程序,进行设置断点、单步执行等操作。当程序暂停执行时,可以使用命令查看程序中的变量值、CPU的寄存器值、内存的值以及函数调用栈等信息。 ? ?

  被调试的应用程序在编译时最好使用-g参数将调试信息编入目标文件中:

  gcc -g app.c -o app

  用以下命令启动对程序app的调试:

  gdb app

  如果程序app运行时需要参数,则用以下命令:

  gdb --args app arg1 arg2? // arg1和arg2被视为app的参数,而不是gdb的参数

  启动后进入GDB交互界面,可以输入GDB的命令进行调试,常用命令如下(回车是重复上一条命令):

  

Linux系统(二)——Linux环境下的开发工具_vim_06

  ?

  Shell进阶那一块看着有点复杂,不太容易搞定,需要再抽个时间仔细过一过了,今天就到这儿了,算是完成了今天的目标吧。总结一下今天:白天有点贪玩,浪费了一部分时间,以后尽量把娱乐时间安排在晚上9点以后。另一个方面是需要规划一下运动时间,今天只是在晚饭后在外面溜达了几圈,运动量太少了,需要加强!明天一天把C语言的所有语法过一遍,这些东西应该已经熟记于心了,再快速过一遍,查缺补漏,顺表敲一些常用的,简单的数据结构实例,为后天做准备。

举报

相关推荐

0 条评论