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

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

一、vim编辑器

1,工作模式

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

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

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

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

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

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

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

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

(a)移动光标类:

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

(c)编辑类:

(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   

2、gcc的基本用法

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

-Wall:打开所有警告项

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

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

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

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

使用举例:

三、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)实例二:

变量是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的命令进行调试,常用命令如下(回车是重复上一条命令):

 

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

猜你喜欢

转载自blog.csdn.net/iotflh/article/details/86499259