linux下的常用工具

1、编辑器

       linux中常用的编辑器主要是gedit编辑器和vim编辑器,接下来主要对vim编辑器进行描述。

       vim编辑器有四种模式:①命令模式;②插入模式;③底行模式;④可视模式。

       (1)命令模式

              打开文件默认进入命令模式

              命令:

                     ①文本删除操作

                            d0:删除从光标前一个字符到行首内容

                            D或d$:从光标到行尾

                            (n)dd:删除光标所在行(n代表要删除的行数)

                            (n)dw:删除一个单词(n代表要删除的单词数)

                            n代表操作的个数

                     ②文本复制操作

                            (n)yy:复制光标所在行(n代表当前及后n-1行)

                            Y:  复制光标所在行

                            (n)yw:复制一个单词(n表示复制指定的n个单词)

                     ③文本粘贴指令

                            p:  粘贴当前缓冲区内容

                     ④撤销指令

                            u

                     ⑤重做

                            ctrl+r

                     ⑥屏幕滚动

                            Ctrl + u:将屏幕向前翻滚半屏幕

                            Ctrl + d:将屏幕向后翻滚半屏幕

                            Ctrl + f:将屏幕向后翻滚一屏幕

                            Ctrl + b:将屏幕向前翻滚一屏幕

                     ⑦指针行跳变

                            n+enter 下移动n行

                            0 本行开头 $行尾

                            nG:光标移动倒n行

                            gg   G:跳 开始、结尾

                            gg=G----自动对齐

(2)插入模式

              ①插入文本命令

                     i:将文本插入到光标所在位置

                     I:将文本插入到当前行首

              ②追加文本命令

                     a:将文本加到光标所在位置之后

                     A:将文本追加到所在行尾

              ③空行插入命令

                     o:在光标所在行下面添加空行

                     O: 在光标所在行上面添加空行

              在插入模式下按esc进入命令行模式

       (3)底行模式

              ①底行操作

                     命令模式下按冒号进入

              ②退出指令

                     q!:强制退出

                     w: w    filename

                     w!:w!   filename

                     wq:先保存在退出

                     x:若修改保存退出否则直接退出

              ③搜索字符串

                     /字符串

                     ?字符串

              ④字符串替换

                     n1,n2 s /str1/str2/g 

                     从第n1行开始,到n2行结束,所有的str1被替换为str2

       (4)可视模式

              命令模式下v进入可视模式:d:删除  y:复制  x:剪切

2、编译器

         linux下常用编译器主要是gcc编译器

       编译流程:

       (1)编译预处理

              编译预处理就是去处理预处理命令(#开头的命令)

              包含头文件,展开宏定义,处理条件编译等

                  gcc –E xxx.c –o xxx.i

         (2)编译

              将C语言代码翻译为汇编代码

              gcc –S xxx.i –o ttt.s

       (3)汇编

              将汇编代码查表转换成二进制代码

              as ttt.s –o yyy.o

       (4)链接

              把程序需要使用的库全部链接起来

              gcc yyy.o –o zzz

       -o:改变输出文件名称的一个参数,后边跟着的一定是生成文件的名称

       -c:只编译不汇编链接,产生一个.o后缀的文件

       -S:产生汇编文件,生成一个.s后缀的文件

       -E:预处理源文件

             -E意思就是prEprocess。输出不是送到一个文件而是标准输出。

       -g:添加调试信息

3、动态库与静态库

       使用动态库和静态库的作用就是保护源代码,写好功能实现代码之后,如果不想给别人源代码,我们可以进行代码封装,将代码编程库文件,这样只需要提供给别人使用即可。

       库的概念:包含了通用函数的数据和二进制可执行机器码的文件

       库的优点:①封装性;②移植性;③保护源码

(1)静态库

       ①只编译不链接,生成一个.o后缀的文件

       gcc –c xxx.c默认生成xxx.o

       gcc –c xxx.c –o yyy.o

       gcc –c xxx.c zzz.c www.c

       ②打包生成静态库

       ar rc libxxx.a yyy.o zzz.o xxx.o www.o

 

静态库的使用:

有了静态库之后,我们就可以不需要程序源码了。

静态库的使用,需要指定我们使用那个库并且执行库的路径

-l(小写的L):指定使用哪个库(提供库的名称)

-L(大写的L):指定库的存放位置(提供绝对路径即可)

-I(大写的i):指定头文件路径

 

 

上述操作是把库文件和头文件全部放在我们自己的路径下,编译的时候,系统找不到这些文件的存在

所以需要我们使用-L参数去指定库文件路径,使用-I参数去只当头文件路径

我们也可以把我们自己写的库文件和头文件放在系统执行路径下,这样编译的时候就不需要指定路径了。

库文件默认路径:/usr/lib

头文件默认路径:/usr/include

 

即使库文件和头文件已经拷贝到了对应的路径下,但是在编译时候仍然需要指定使用的库名称,因为我们的库不是系统默认库

(2)动态库

       ①只编译不链接,生成.o后缀的文件

       gcc –c xxx.c

       gcc –c xxx.c –o yyy.o

       ②打包生成动态库

       gcc –fpic –shared xxx.o yyy.o –o libxxx.so

 

动态库和静态库的区别

静态库在编译的时候,会默认被编译进可执行程序,接下来在代码执行的时候就不需要静态库做支撑了。

动态库在编译的时候,相当于把这个库链接过来使用,在程序执行的时还得去依赖这个库,

所以在使用动态库的时候,需要把动态库拷贝到指定路径(/usr/lib)

 

4、gdb调试工具

       gdb是unix及unix-like下的调试工具,gdb是GUN project调试器,它使你可以查看另一个程序在执行过程中正在执行的操作或该程序崩溃时正在执行的操作。

       一般来说,gdb主要是完成四个方面的功能:

       (1)启动你的程序,可以按照你的自定义的要求随心所欲的运行程序。

       (2)可以让被调式的程序在你所指定的配置的断点处停住。(断点可以是条件表达式)

       (3)当程序被停住时,可以检查此时你的程序中所发生的事。

       (4)你可以改变你的程序,将一个bug产生的影响修正从而测试其他bug

       gdb调试其实就是一个进程(任务),在这个任务里面去运行另外一个任务(调试的程序)。

       如果想要使用gdb调试工具,那么在编译程序时需要加“-g”参数。

 

       进入调试的方式:

       (1)gdb+可执行程序

       (2)若程序正在运行

              gdb 程序   当前程序对应的进程号

gdb  -p    当前程序对应的进程号

       结束gdb调试的方式:

       (1)quit(q)

       (2)ctrl+d

       您可能需要将GDB命令的输出保存到文件中。有几个命令可以控制GDB的日志记录。

··      (1)set logging on

启用日志记录。

(2)set logging off

禁用日志记录。

(3)set logging file 【file】

更改当前日志文件的名称。默认日志文件是gdb.txt。

(4)set logging overwrite [on|off]

默认情况下,GDB将追加到日志文件。设置overwrite是否要set logging on覆盖日志文件。

(5)set logging redirect [on|off]

默认情况下,GDB输出将同时到达终端和日志文件。设置redirect,如果你想输出去只到日志文件。

(6)set logging debugredirect [on|off]

默认情况下,GDB调试输出将同时到达终端和日志文件。设置debugredirect是否只将调试输出转到日志文件。

(7)show logging

显示日志记录设置的当前值。

 

       开始程序运行:run(r)

 

list在gdb命令行显示代码,默认显示10行,多次执行,依次往后边显示。

list+起始行号+结束行号:显示两个行号之间的代码

 

break+行号:在只当行号添加断点,当程序执行断点到这个位置就不再继续执行

程序执行到断点停下的时候,打断点所在行并没有执行

 

 

 

再次去运行正在运行的程序,会提示是否从头开始运行--》如果是,就会再次执行,如果不是,就失败了

 

查看断点信息:

info breakpoint

 

cont:继续运行代码,直到下一个断点

 

delete(d)+断点编号-->删除断点

 

disable breakpoint 断点编号--》失能断点

让这个断点无效

enable breakpoint 断点编号--》使能断点

让这个断点有效

clear+行号:清除指定行的断点

 

 

start:开始调试--》只是启动调试,并且设置了一个临时断点(程序开头)

 

next(n):下一步(单步执行)

遇到子函数直接执行,得到结果

 

step(s):下一步(单步执行)

遇到子函数,会跳转到子函数里边去执行

 

finish:结束循环  结束函数

当程序进入子函数运行的时候,使用finish可以直接结束这个子函数

setp,next和finish的区别:

(1)step 就是单步执行,遇到子函数就进入并且继续单步执行;在其他调试其中相当于step-into命令,作用是移动到下一个可执行的代码行。如果当前行是一个函数调用,则调试器进入函数并停止在函数体的第一行。step可以帮助初步揭开代码位置的谜团,例如:函数调用和函数本身可能在不同的文件中。

(2)next 是在单步执行时,在函数内遇到子函数时不会进入子函数内单步执行,而是将子函数整个执行完再停止,也就是把子函数整个作为一步。在其他调试器中相当于step-over,作用是在同一个调用栈层中移动到下一个可执行的代码行。调试器不会进入函数体。如果当前行是函数的最后一行,则,next将进入下一个栈层,并在调用函数的下一行停止。

(3)finish就是当单步执行到子函数内时,用step out就可以执行完子函数余下部分,并返回到上一层函数。在其他调试器中相当于step-out,作用是在栈中前进到到下一层,并在调用函数的下一行停止。

5、工程管理工具Makefile

       一个工程中的源文件不计其数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至可以进行更复杂的功能操作。因为makefile就像一个shell脚本一样,也可以执行操作系统的命令。

       作用:组织代码编译

       原则:在进行编译的时候,只会编译做了修改的地方,如果没有改动,就不需要重新编译。

 

    

   makefile(Makefile):文件

Makefile 文件描述了整个工程的编译、连接等规则

make:命令

make是一个命令工具,它解释Makefile 中的指令

       我们在命令行执行make,会自动去查找当前路径下的makefile(Makefile)文件,然后按照文件内容去进行代码编译,makefile在编写的时候遵循一定的格式:

       目标:依赖

(tab)规则

目标:要做的事情

依赖:源文件

规则:怎样从依赖去实现我们的目标

 

目标:a.out

依赖:1.c

规则:gcc 1.c

 

makefile在使用的使用,里边可以同时写很多个目标,但是在使用make执行的时候,默认只会去执行makefile里边的第一个目标,要想去执行其他目标,需要在执行make的时候加上目标名称。

 

默认执行make,就会去执行第一个目标

当执行make clean的时候,执行的是第二个目标

 

       clean目标叫做伪目标

当前文件夹下边没有名称是clean的文件,执行make clean,默认执行的是makefile里边的clean目标,就要去删除*.i *.s等文件,由于文件不存在,无法删除。

 

当当前路径下存在clean文件的时候,再去执行make clean,就会认为是在生成clean文件由于clean文件没有变化,所以认为是最新的。我们实际上要执行的删除操作也没有实现

 

这是因为make解释器默认将clean目标当作一个文件处理,而不是一个标签。将clean当成一个文件时,make发现当前目录下有此文件,而且此目标没有依赖,即认为目标是最新的。最终make给出了clean是最新的结论。

解决方案:

gun make中提供了关键字.PHONY,这个关键字用于定义一个伪目标,此时,伪目标不再对应任何实际的文件,make不再将伪目标当作文件处理,而是当成一个标签。不管伪目标的依赖是否更新,命令总是执行。

 

makefile里边的注释是用#进行注释操作

Makefile中的变量只能是字符串类型

Makefile中变量有四种赋值方式:

(1)简单赋值(:=)

       编程语言中常规理解的赋值方式,只对当前语句变量有效

 

 

(2)递归赋值(=)

赋值语句可能影响多个变量,所有目标变量相关的其他变量都受影响

 

 

(3)条件赋值(?=)

如果变量未定义,则使用符号中的值定义变量,如果该变量已经赋值,则该赋值语句无效。

 

 

(4)追加赋值(+=)

原变量用空格隔开的方式追加一个新值

 

 

变量的使用:$(变量名)

预定义变量:

固定的宏:

$@:目标

$^:所有的依赖

$<:第一个依赖文件

$*    不包括后缀名的当前依赖文件的名字

$?    当前目标所依赖的文件列表中比当前目标文件还要新的文件

CC:c程序编译器,默认值是cc(也就是gcc)

AS:汇编编译器,默认值是as

AR:归档维护程序的名称,默认值是ar

CPP:C 预编译器的名称,默认值为 $(CC) -E

RM:删除,默认值是rm -f

CFLAGS:c编译的选项

CPPFLAGS:预编译选项

ASFLAGS:汇编选项

LDFLAGS:链接选项

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值