Linux 环境基础开发工具

发布于:2023-01-22 ⋅ 阅读:(268) ⋅ 点赞:(0)

目录

一.软件包管理器yum

1.软件安装

2.查看软件包、lrzsz

3.安装和卸载

二.vim编辑器

1.vim的模式

(1)正常模式

(2)插入模式

(3)底行模式

(4)替换模式

2.vim的基本操作

3.vim正常模式命令

4.vim底行模式命令

5.vim配置

三.gcc/g++

1.gcc/g++如何生成一个文件

2.函数库

四.gdb调试工具

1.介绍

2.使用

五.Linux项目自动化构建工具make/Makefile

1.介绍

2.使用

依赖关系:

依赖方法:

3.make原理

4.项目清理

六.进度条

1.行缓冲区

2.倒计时

 3.进度条

七.git

1.clone

2.status

3.add

4.commit

5.push

6.pull

7.log

8.gitignore


前言:这一篇将会开始学习yum安装工具,以及vim开发工具等工具,学习之后,我们将可以使用Linux进行代码编写、调试等操作。

一.软件包管理器yum

1.软件安装

Linux安装软件分为3种:

①源码安装:下载到程序的源代码,并进行编译,得到可执行程序。

②rpm安装:只下载一个程序,而不包括该软件所需要的各种库,这些库需要自己安装。

前两种安装起来都很麻烦,因此有了第三种yum。

③yum安装:不用编译源码(①),也不用解决依赖关系(②)

        有些人把一些常用的软件提前编译好,做成软件包放在一个服务器上,通过包管理器可以很方便的获取到这个编译好的软件包,直接进行安装。

2.查看软件包、lrzsz

        通过yum list可以罗列出当前一共有哪些软件包,由于包的数目很多,这里需要使用grep命令来筛选我们想要的包。

yum list | grep lrzsz

        lrzsz是一个用于window机器和远端的Linux机器通过XShell传输文件的工具,安装完毕之后可以通过拖拽或指令的方式传文件。 

注意事项 :
①软件包名称: 主版本号.次版本号.源程序发行号-软件包的发行号.主机平台.cpu架构.
②"x86_64" 后缀表示64位系统的安装包, "i686" 后缀表示32位系统安装包. 选择包时要和系统匹配.
③"el7" 表示操作系统发行版的版本. "el7" 表示的是 centos7/redhat7. "el6" 表示 centos6/redhat6.
④最后一列, base 表示的是 "软件源" 的名称, 类似于 "小米应用商店", "华为应用商店" 这样的概念

3.安装和卸载

安装:

sudo yum install lrzsz

yum 会自动找到都有哪些软件包需要下载 , 这时候敲 "y" 确认安装 .
出现 "complete" 字样 , 说明安装完成 .
注意事项 :

安装软件时由于需要向系统目录中写入内容, 一般需要 sudo 或者切到 root 账户下才能完成.

yum安装软件只能一个装完了再装另一个. 正在yum安装一个软件的过程中, 如果再尝试用yum安装另外一个软件, yum会报错.

卸载:

sudo yum remove lrzsz

二.vim编辑器

1.vim的模式

(1)正常模式

        控制光标的移动,字符、字或行的删除,移动复制某区段及进入其它模式。

(2)插入模式

        进行代码输入的模式,是用的最频繁的编辑模式。

(3)底行模式

        文件保存或退出,也可以进行文件替换,找字符串,列出行号等操作。

(4)替换模式

        可以替换当前字母,进行批量化替换。

2.vim的基本操作

① 刚进入vim时,处于正常模式。

② [正常模式]切换至[插入模式]

        输入i:在当前位置进入插入模式

        输入a:在下一个字符位置进入插入模式

        输入o:在下一行位置进入插入模式

③ [正常模式]切换至[底行模式]

        shift + :

④ [正常模式]切换至[替换模式]

        shift + r

        就是R

⑤ [其它模式]切换至[正常模式]

        按Esc键即可

⑥ 退出vim及保存文件,是在底行模式下

        w(保存当前文件)

        wq(保存并退出)

        !q(强转退出)

        !wq(强转保存并退出)

3.vim正常模式命令

① 复制、粘贴

        yy:复制当前行

        nyy:从当前行开始复制n行

        p:粘贴在当前行的下一行

        np:粘贴n个在当前行的下一行

② 剪切、删除

        dd:剪切(删除)当前行

        ndd:剪切(删除)从当前行开始的n行

③ 撤销操作

        u:撤销刚刚的操作

        shift+r:针对u操作,进行撤销

④ 光标移动到末尾行、开头行

        shift+g:光标快速移动到文本末尾行

        gg:光标快速移动到文本开头行

        n+shift+g:光标快速定位到文本的任意一行

⑤ 光标移动到行末尾、开头

        shift+4:光标快速移动到文本行末尾

        shift+6:光标快速移动到文本行开头

⑥ 向后、向前以单词为单位进行光标移动

        w:向后以单词为单位移动

        b:向前以单词为单位移动

⑦ 上下左右移动

        h:左

        l:右

        j:下

        k:上

⑧ 大小写快速切换

        shift+~:快速切换当前字符大小写

⑨ 替换、删除

        r:替换光标所在字符(输入r之后再输入其它字符,会用该字符替换当前字符)

        nr:替换光标所在字符后面n个

        x:删除光标所在字符

        nx:删除光标所在字符后面n个

4.vim底行模式命令

① 保存文件

        w:输入w可以保存文件

② 退出vim

        q:直接退出,若无法退出,可以加上一个 ! 强制退出

        wq:退出的时候保存文件

③ 列出行号

        set nu:输入后,可再每一行前面列出行号

5.vim配置

        vim最开始只是像记事本一样,很难用,因此需要我们自己去配置,通过配置就可以让vim有很多功能,例如自动补齐,语法高亮,自动缩进等等。

三.gcc/g++

1.gcc/g++如何生成一个文件

gcc test.c -o mytest

通过上面的指令可以直接生成一个可执行文件mytest。

如何不加-o生成的可执行文件叫a.out,这里的-o相当于给这个可执行文件重命名。

(1)预处理

① 预处理主要包括宏定义、宏替换、包含文件、条件编译、去掉注释

② 得到预处理之后的文件:gcc -E test.c -o test.i

③ 一般把预处理之后的文件后缀加.i

(2)编译(生成汇编)

① 编译是检查代码的规范性,是否有语法错误等,检查无误后,把代码翻译为汇编语言

② 得到编译之后的文件:gcc -S test.i test.s

③ 一般把编译之后的文件后缀加.s

(3)汇编(转换为二进制代码)

① 编译是把汇编语言转换成二进制代码

② 得到汇编之后的文件:gcc -c test.s test.o

③ 一般把汇编之后的文件后缀加.o

(4)链接

① 链接是去静态库或动态库中找到对应的函数,进行链接。

② 链接之后的文件就是可执行文件,既可以通过.o文件得到:gcc test.o -o test

     也可以通过.c文件直接得到:gcc test.c -o test

2.函数库

        说到链接,就跟函数库有关,函数库分为静态库和动态库。

        我们所实现的C程序没有定义”printf“的函数实现,并且在预处理中包含的”stdio.h“中也只有该函数的声明,而没有定义的函数的实现,那么是在哪实现类似”printf“这样的函数呢?

         在linux中,这些函数被放到了libc.so.6的库文件中去了,在没有特殊指定时,gcc就会去进行查找,也就是链接到了libc.so.6的库函数中去了,这样就可以实现像”printf“这样的函数了,这就是链接的作用。

        

        这里的函数库分为静态库和动态库。

        静态库:指编译链接时,把库文件中的代码全部加入到可执行文件中,因此生成的文件比较大,但运行时就不需要库文件了。其后缀名一般为.a

        动态库:与静态库相反,动态库在链接时并没有把库文件的代码加入到可执行文件中,而是在程序执行时由运行链接文件加载库,这样可以节省系统的开销。动态库一般后缀名为.so,前面的libc.so.6就是动态库。gcc在编译时默认使用动态库。

四.gdb调试工具

1.介绍

        gdb是一个调试工具。

        在linux中生成的可执行文件默认是release版本,是不支持调试的,因此想要使用gdb调试,就要加上-g,让生成的可执行文件是debug版本的。

2.使用

(1)l:显示代码

(2)b:打断点

(3)d:输入断点编号,取消该断点

(4) s:step 逐语句(会进入函数)

(5) n:next 逐过程(不会进入函数)        

(6)display:常显示某个变量

(7)undisplay:取消常显示

(8)    p:显示一次某个变量值

(9)until:跳转到某个指定的行

(10)r:运行程序

(11)c:从一个断点跳转到另一个断点

(12)finish:执行完成一个函数后就停下来

五.Linux项目自动化构建工具make/Makefile

1.介绍

        在一个工程中,源文件不计其数,要是通过我们自己挨个去gcc/g++会非常的麻烦,因此可以使用Makefile,Makefile定义一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,或者进行更复杂的功能操作。

        Makefile的好处就是——自动化编译,在Makefile中写好之后,至需要一个make命令,整个工程就可以自动编译,极大的提高了软件开发的效率。

        make是一个命令工具,是一个解释Makefile中指令的命令工具。Makefile是一个文件两个搭配使用,来完成项目自动化的构建。

2.使用

        我们用一个很简单的代码作为例子。

#include <stdio.h>

int main()
{
    printf("hello Makefile!\n");
    return 0;
}

我们创建一个文件test.c。

如果对test.c进行预处理、编译、汇编、链接操作就会得到test.i、test.s、test.o、可执行文件test

这里要说一下依赖关系和依赖方法:

依赖关系:

        test,依赖test.o

        test.o,依赖test.s

        test.s,依赖test.i

        test.i,依赖test.c

依赖方法:

        gcc test.c -o test

Makefile文件中写:

mytest:test.c
    gcc test.c -o test

.PHONY:clean
clean:
    rm -f test

然后输入make命令就可以直接生成可执行文件test,输入clean就可以删掉可执行文件test。

3.make原理

① make会在当前目录下找名字为“Makefile”或“makefile”的文件

② 如果找到,它会找文件中的第一个目标文件,上面的例子是test

③ 如果test文件不存在,或者test所依赖的后面test.o的文件修改时间要比test这个文件新,那么它就会执行后面所定义的命令来生成test这个文件。

④ 如果test所依赖的文件不存在,那么make会在当前文件中找目标为test.o所依赖的文件,如果找到则根据那一个文件的规则生成test.o文件。

⑤ make会一层一层的去找文件的依赖关系,直到最终编译出第一个目标文件。

⑥ 在找寻的过程中,如果出现错误,那么make就会直接退出,并报错,而对于所定义的命令的错误,或是编译不成功,make不会管。

⑦ make只管文件的依赖性,如果在找了依赖关系之后,冒号后面的文件还是不再,那么make就停止运行了。

4.项目清理

        工程是需要被清理的。

        像clean这种,没有被第一个目标文件直接或间接关联,那么它后面所定义的命令将不会被自动执行,不过,我们可以显式要make执行,即命令make clean,依次来清除所有的目标文件,以便重新编译。

        但是一般clean的目标文件,我们将它设置为伪目标,用.PHONY修饰,伪目标的特性是:总是被执行的

六.进度条

1.行缓冲区

#include <stdio.h>
int main()
{
    printf("hello Makefile!\n");
    sleep(3);
    return 0;
}
#include <stdio.h>
int main()
{
    printf("hello Makefile!");
    sleep(3);
    return 0;
}

        这两个一个有\n,一个没有,而且结果的现象也不同,上面有\n的先打印出结果,然后等了一会。下面没有的则是先登了一会才打印出结果。这个就与缓冲区有关了。

        缓冲区就是一段内存空间,遇到\n就会让数据立刻刷新出来(行刷新),如果不想用\n,也可以用fflush。

        这里我们注意区分 回车换行的区别,回车是将光标回到当前行的最开始,换行是新起一行。

        回车是\r,而回车+换行是\n。

2.倒计时

        这里我们先实现一个倒计时程序。

#include <stdio.h>
#include <unistd.h>

int main()
{
    int cnt = 9;
    while(cnt)
    {
        printf("%d\r", cnt--);
        fflush(stdout);
        sleep(1);                                                               
    }

    return 0;
}

        这个就是靠fflush的刷新来实现。

 3.进度条

        然后我们再来实现进度条:

#include <stdio.h>
#include <string.h>
#include <unistd.h>

#define NUM 101
#define STYLE '#'

void process()
{
    char bar[NUM];
    memset(bar, '\0', sizeof(bar));

    const char *lable = "|/-\\";

    int cnt = 0;
    while(cnt <= 100)
    {
        printf("加载中:\033[34m%-100s\033[0m[%d%%][%c]\r", bar, cnt, lable[cnt%4]);
        fflush(stdout);
        bar[cnt++] = STYLE;
        //bar[cnt] = '>';
        usleep(200000);
    }
    printf("\n");
}

int main()
{
    process();

    return 0;
}

效果: 

         这里我们先给进度条预留空间,然后依次从左往右依次存入数据,并且预定好%的位置,以及后面跟随变化的数组。这里的颜色是可以随便调整的,可以上网搜索。

七.git

        git:版本控制器

1.clone

git clone

 作用:把远端仓库克隆到本地

2.status

git status

作用:显示本地仓库和远端仓库之间的关系

3.add

git add

作用:添加文件

4.commit

git commit -m "提交日志"

作用:将文件添加到本地仓库

5.push

git push

作用:将本地仓库代码提交到远端仓库

6.pull

git pull

作用:当前代码和远端代码不同时,无法提交,pull之后使当前代码与远端代码相同

7.log

 git log

作用:查看提交日志

8.gitignore

gitignore

作用:黑名单,属于gitignore中结尾的文件不提交