(20220115)Linux开发工具的使用

一、vim编辑器

1、文本编辑(三种模式:命令行模式、插入模式、底行模式(底行冒号))

        命令行模式可以与插入模式相互转化,只有命令行模式能进入底行模式

命令行模式(不能录入程序,只能整块复制、移动、删除;)        

        1、此模块直接录入命令

              (n)yy  复制命令 (表示从光标位置复制到第n行);

                p 粘贴命令(区分大小写:大写表示从光标所在行开始粘贴,小写表示从光标下一行开始粘贴 );

                u 撤销命令 (可以连续撤销);

                (n)  dd  剪切/移动命令    (表示从光标位置剪切到第n行);

                G  光标移动到尾部

                V 光标选择所在的一行,v (可视行,可选择连续多行),ctrl + v (可视块,可选择整块内容s)

                d1G 把光标所在位置到文件第一行全删除,y1G 把光标到文件第一行的内容全复制

                dG   光标到文末 全删,yG 光标到文末 全复制;

                (n) x 删除后n个字符 , (n) X 删除前n个字符

        2、此模块录入命令前需要(:)       

                 :/name(内容)  查找名为name的内容;n 将查找内容向上切换,N 将查找内容向下切换

                 :n1,n2  s/word1/word2/g  (将第n1行到第n2行的字符word1替换为word2);

                    1 ,  $   -s/word1/word2/  (将全文的字符word1替换为word2)

底行模式(用冒号(:)开头,写入命令)

               1、一般命令

                :w 保存; :w  文件名(将当前文件的内容另存为设定的文件名中);

                :n1,n2   w 文件名 (将当前文件的第n1行到第n2行的内容另存为设定的文件名中)

                :q 退出; :q! 强制推出;     

                :r   (文件名) (将其他文件中的内容读写到当前文件的光标下面)

                :set nu 显示行号 ;   :set nonu  不显示行号;

                :!ls (在vim模式下,查看当前目录下的所有文件)

                2、多文档编辑

                 vim  原文件.c  源文件.c.....(可以若干个同时打开),

                :n  将打开的文件向后切换    :N  将打开的文档向前切换

                :files  在窗口显示总共打开了几个文件

                :q  全退出

                3、多窗口编辑

                vim  源文件.c 

                : sp 源程序.c (加入另一个程序窗口)

                :ctrl  ww  上下两个窗口互换

                :ctrl  wj   切换到下面窗口

                :ctrl  wk  切换到上面窗口 

                :q  全退出

二、gcc工具链

从C语言源码到可执行程序一般要经过以下的处理步骤:

1. 预处理    

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

        #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    

 5、选项标识

        -O ,-O2,-O3  优化代码;

        -g (gdb 调试器) 代码会成倍增大。

        -C  编译时,注释不删除;

        -I  指出头文件位置   , -L  指出库的路径  ;-l  指出库名(-lname)

        当在gcc程序时遇到: 数学运算(开根号)、数据库编程、线程编程、三种情况时,需要录入 -lm、-lsqlite3、-lpthread 三种库名。

创建库(重点):库中二进制目标文件,不能含有主函数

1、创建头文件(如:main.h):

vim main.h(在里面写入需要调用函数的声明):

2、创建静态库

        使用方法:gcc -c 源程序(.c 文件)【将源程序转化为目标文件(.o 文件)】;

                          ar rcs 静态库名(lib+name.o) 目标文件1 目标文件2 ....【将目标文件创建为库】

                          使用库:gcc 主程序.c -o  可执行文件  -L(库的路径)  -lname  [-I(头文件路径)]

          库和头文件在当前目录下:

        库和头文件不在当前目录下(在text目录中):

3、创建动态库

        使用方法:gcc -shared -fPIC -o 库名(ib(name).so)  源文件(.c 文件 可以若干个);

                          gcc 主程序.c  库路径(./动态库名(.so文件)) -o 可执行文件  [-I(头文件路径)]

            库和头文件在当前目录下:

  库和头文件不在当前目录下(在text目录中):

C语言中常见问题:

1、解决C语言中从键盘输入空格的三种方法:

        scanf("%[^\n]",&x);   gets()(只认回车键,但是有警告!);fgets();

2、警告:-Wall (非致命警告);-w (不生成警告信息)

3、宏定义

        -DPI = 3.14  (在gcc编译命令中直接添加)

        -UPI  (取消宏定义)

三、gdb调试器

        主要功能:控制程序运行(在gcc 中加入 -g )

        启用gdb的常用步骤:前三步必须做,缺一步就没有调试的意义

        1、启用被调试程序

                gcc -g  源文件.c   -o  可执行文件;

                gdb  可执行文件名;

                (加入gdb模式)

        2、进入gdb模式后,设置断点(break(b))

                b  (n)  设置第n 行为断点

                b  函数名   设置函数为断点

                断点编号是指按设置断点的先后对断点的编号;

                断点设置后,才能用 info break(b) 查看断点信息;

        3、运行程序(run 运行程序)

                只有整个程序运行起来之后,才能进行以下操作:

                next(n):单步运行; continue(c):运行到下一个断点;

                finish(f):完成函数运行(用于函数断点),到调用位置。

                p 变量名  (显示变量名的值)

                退出调试 用q

         gdb模式下的命令:

                1、list(l)命令 :

                l:(查看代码,默认10行); l  (函数名):从指定函数显示;

                l(行号):从指定行号显示

                2、break(b)命令:

                     break(b) 函数名: 在某函数入口处添加断点;

                     break(b) 行号:在指定行添加断点

                     break(b) 行号 if 条件 当条件为真时,指定行号处断点生效,

                     例b 5 if i=10,当i等于10时第5行断点生效

                      info break  显示断点信息

                4、run(r)  开始运行程序

                5、next(n)  单步运行程序(不进入函数)

                6、step(s)  单步运行程序(进入函数)

                7、continue(c) 继续运行程序

                8、print(p) 变量名 查看指定变量值

                9、finish  直到当前函数结束

                10、watch 变量名 对指定变量进行监控

                11、quit(q)  退出gdb

                12、delete(d)断点编号  (删除断点)

                13、start  跳转到主函数第一句

                15、set 变量名 = 值 :改变变量值

                16、clear清除断点命令

                       clear  行号  (清除行号断点)

                        clear 函数名  (清除函数断点)

                17、enable 激活

                18、disable 失效

        C语言函数调用相关问题:

                1、函数调用到哪,函数就返回到哪;

                2、函数返回

                        返回值(return 0;return只能返回一次)

                        流程返回(void 函数,}表示返回功能)

                3、函数返回的值由函数的类型决定

        流程转向问题:(限定性与非限定性)

                限定性:continue 、 break  、函数调用、 函数返回

                非限定性:由我们自己指定(如:goto 语句:多用于多重循环嵌套)

四、make工具

        1、make的定义       

         Make工程管理器(多文件编译)

        特点:自动编译管理器,只对修改过的文件做编译;读入makefile文件的内容来执行大量的编译工作。

        目的:用makefile文件的规则对编写的所有文件进行编译。

        2、makelifed的内容(makefile是make读入的惟一配置文件)

        makefile中通常包含如下内容:    

        a.需要由make工具创建的目标体(如:main(开头顶行写)),

                通常是目标文件(.o文件)或可执行文件(main编译后文件);    

        b.要创建的目标体所依赖的文件;

                创建每个目标体时需要运行的命令(command),这一行必须以制表符(tab键)开头

        具体情况如:

                main(最终目标):add.o sub.c nul.c div.c main.h main.c (依赖)【依赖转化为目标体】
                ( tab)gcc  sub.c nul.c div.c main.c -o main(命令)

                {以上为一个规则}

                add.o(目标体):add.c(依赖)【将依赖通过命令转化为目标体的操作】

                (tab)gcc -c add.c (命令)

                (重点):下层的目标体为上层的依赖;一个makefile有多个规则,多个规则就有多个目标体,但是只有一个最终目标体;目标的需求(依赖),为下一个规则的目标。

        3、makefile的创建与使用

                 创建makefile的要点:

                1、makefile与Makelife同时存在时,makefile优先

                2、makefile是make读入的默认统一的配置文件

                3、makefile是规则(makefile是默认文件名,可以自定义)

                4、makefile命名

                        自定义:编译时:make -f  文件名

                        默认(makefile):编译时:直接make

                5、“#”字符后的内容被视作注释;@:取消回显;

                makefile的伪目标:

                1、若创建的目标没有依赖,则属于伪目标(伪目标的执行方式为:make + 伪目标名)

                        .PHONY : clean    (“.PHONY” 将“clean”目标声明为伪目标)

                        clean : 

                                   rm –f hello main.o func1.o func2.o

                2、伪目标声明的意义在于,如果有可执行文件与伪目标同名;make clean 就不会执行伪目标,而去执行可执行文件。

                使用变量:(用$符合引用)

                        obj=main.o func1.o func2.o func3.o

                        hello: $(obj)   

                                 gcc $(obj) -o hello

                在makefile中,存在系统默认的自动化变量

                        $^:代表所有的依赖文件

                        $@:代表目标

                        $<:代表第一个依赖文件

                        例:(以下两个规则是相同的)

                                 hello: main.o func1.o func2.o     

                                        gcc main.o func1.o func2.o -o hello  

                                hello: main.o func1.o func2.o          

                                         gcc $^ -o $@

        makefile的使用:

                1、自己创建makefile

                                makefile 命名为 life;最终创建以下的文件目录:

                                 

                               life的编写              

                         创建好life后, 执行 make -f  life

                2、运用makefile的模板(client)

                          client模板中的环境配置:

                    环境中总共有三处 makefile: main(主函数文件下的makefile; 根目录下的makefile;  scripts 目录下的makefile;)

                使用方法:(一个添加,两个删除,三个修改)

                        1、删除client(原本属于主函数(主功能))

                        2、删除原有的不符合自己要求的功能函数(check_putin, pack_message)

                        3、添加自己的函数功能(如:add、div、sub等)

                        4、修改include 头文件内容(一般指 函数声明)

                        5、修改主函数(main)的功能

                        6、修改scripts中的makefile(规则:一般指函数功能的编译命令)

                         修改过后的环境:                        关于scripts/makefile 的修改:

                 关于include 头文件的修改:(函数声明)

 

五、shell工具    

        1、shell的含义

        Shell本身是一个用C语言编写的程序,它是用户使用Linux的桥梁。

        Shell既是一种命令语言,又是一种程序设计语言。作为命令语言,它互动式地解释和执行用户输入的命令;

        2、shell程序基础

        程序必须以下面的行开始(必须方在文件的第一行):

        #!/bin/sh

        #!用来告诉系统它后面的参数是用来执行该文件的程序。

        要使脚本可执行:

        chmod +x filename

        然后,您可以通过输入: ./filename 来执行您的脚本

        3、变量

        在其他编程语言中您必须使用变量。在shell编程中,所有的变量都由字符串组成,并且您不需要对变量进行声明。要赋值给一个变量,您可以这样写:

        变量名=值

        取出变量值可以加一个美元符号($)在变量前面

        4、shell程序运行

                #!/bin/sh

                #(为注释符)对变量赋值:

                a="hello world"

        现在打印变量a的内容:

                echo "A is:"

                echo $a

        在编辑器中输入以上内容,然后将其保存为一个文件HelloWorld。

        之后执行chmod +x HelloWorld

        最后输入./ HelloWorld执行该脚本。

        这个脚本将会输出:

                A is:

                hello world

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值