Linux开发工具(个人使用)

Linux开发工具(个人使用)

码农世界 2024-06-05 后端 82 次浏览 0个评论

Linux开发工具

    • 1.Linux yum软件包管理器
      • 1.1Linux安装程序有三种方式
      • 1.2注意事项
      • 1.3如何查看,安装,卸载软件包
        • 1.3.1查看软件包
        • 1.3.2安装软件包
        • 1.3.3卸载软件
        • 2.Linux vim编辑器
          • 2.1vim的基本操作
          • 2.2vim正常模式命令集
          • 2.3vim底行模式命令集
          • 2.4vim配置
          • 3.Linux gcc/g++编译器
            • 3.1预处理
            • 3.2编译(生成汇编)
            • 3.3汇编(生成二进制的代码)
            • 3.4链接(生成可执行文件或库文件)
            • 3.5静态库和动态库
            • 4.Linux gdb调试器
            • 5.Linux Makefile项目自动化构建工具
              • 5.1原理
              • 6.Linux程序进度条
                • 6.1缓冲区
                • 6.2倒计时程序
                • 6.3进度条
                • 7.git命令行

                  1.Linux yum软件包管理器

                  1.1Linux安装程序有三种方式

                  1. 源代码安装(不推荐,问题太多,甚至编译都不成功)
                  2. rpm包安装,安装的本质就是把可执行程序拷贝到指定的路径下即可(不推荐,麻烦容易出错,版本兼容问题)
                  3. yum一键式安装(强烈推荐,可以类比为手机厂商的应用商店或者应用管家)

                  yum的相关文件会保存你所下载软件的下载路径,yum会去自己的服务器中寻找要下载的软件,而Linux服务器是由各种大厂来进行维护和报销费用,各种经过检测过合格的软件会挂在Linux的服务器上供人下载。

                  1.2注意事项

                  关于 yum 的所有操作必须保证主机(虚拟机)网络畅通!!!

                  可以通过 ping 指令验证是否联网

                  ping www.baidu.com
                  

                  1.3如何查看,安装,卸载软件包

                  1.3.1查看软件包

                  通过 yum list 命令可以罗列出当前一共有哪些软件包. 由于包的数目可能非常之多, 这里我们需要使用 grep 命令只筛选出我们关注的包.

                  yum list | grep lrzsz
                  
                  #结果:
                  #lrzsz.x86_64 0.12.20-36.el7 @base
                  

                  软件包名称: 主版本号.次版本号.源程序发行号-软件包的发行号.主机平台.cpu架构.

                  “x86_64” 后缀表示64位系统的安装包, “i686” 后缀表示32位系统安装包. 选择包时要和系统匹配.

                  “el7” 表示操作系统发行版的版本. “el7” 表示的是 centos7/redhat7. “el6” 表示 centos6/redhat6.

                  最后一列, base 表示的是 “软件源” 的名称, 类似于 “小米应用商店”, “华为应用商店”

                  1.3.2安装软件包

                  通过 yum, 我们可以通过很简单的一条命令完成 gcc 的安装.

                  sudo yum install -y lrzsz
                  
                  1.3.3卸载软件
                  sudo yum remove - y lrzsz
                  

                  2.Linux vim编辑器

                  2.1vim的基本操作

                  在输入vim 文件名后

                  其他各种模式切换至正常模式

                  1. 无脑ESC

                  正常模式切换至插入模式

                  1. 输入a(光标向后移动一个字符进入插入模式)
                  2. 输入i (直接进入插入模式)
                  3. 输入o(光标所在行进行换行进入插入模式)

                  正常模式切换至底行模式

                  shift + ; , 其实就是输入 :(冒号)

                  退出vim及保存文件,在正常模式下,按下:进出底行模式

                  w(保存当前文件)

                  q(退出当前文件)

                  !(强制)

                  2.2vim正常模式命令集

                  移动光标

                  vim可以直接用键盘上的光标来上下左右移动,但正规的vim是用小写英文字母h、j、k、l,分别控制光标左、下、上、右移一格

                  gg:进入文本的开始

                  shift+g(G):移动到文章的最后

                  shift+4($):移动到光标所在行的行尾

                  shift+6(^):移动到光标所在行的行首

                  w:光标跳到下个单字的开头

                  e:光标跳到下个单字的字尾

                  b:光标回到上个字的开头

                  删除文本

                  x:删除光标所在位置的一个字符

                  X:删除光标所在位置的“前面”一个字符

                  dd:删除光标所在行

                  ndd:n为数字,从光标所在行开始删除n行

                  复制文本

                  yy:复制光标所在行到缓冲区

                  nyy:复制光标所在行后n行到缓冲区(包括光标所在行)

                  p:将缓冲区内的字符贴到光标所在位置

                  替换

                  r:替换光标所在处的字符。

                  R:替换光标所到之处的字符,直到ESC为止。

                  撤销上一次操作

                  u:回到上一个操作。按多次“u”可以执行多次回复。

                  ctrl + r: 撤销的恢复

                  跳到指定行

                  ctrl」+ g列出光标所在行的行号。

                  nG:表示移动光标至文章的第n行行首。

                  2.3vim底行模式命令集

                  列出行号

                  set nu: 输入set nu后,会在文件中的每一行前面列出行号

                  跳到文件中的某一行

                  n:直接输入数字即可

                  查找字符

                  /关键字: 如果第一次找的关键字不是您想要的,可以一直按「n」会往后寻找到您要的关键字为止。

                  ?关键字:如果第一次找的关键字不是您想要的,可以一直按「n」会往前寻找到您要的关键字为止。

                  2.4vim配置

                  配置文件的位置在目录 /etc/ 下面,有个名为vimrc的文件

                  在shell中输入

                  curl -sLf https://gitee.com/HGtz2222/VimForCpp/raw/master/install.sh -o ./install.sh && bash ./install.sh

                  即可安装vim的插件进行vim的配置

                  3.Linux gcc/g++编译器

                  格式 gcc [选项] 要编译的文件 [选项] [目标文件]

                  3.1预处理

                  预处理功能主要包括宏定义,文件包含,条件编译,去注释

                  预处理指令是以#号开头的代码行

                   gcc –E test.c –o test.i
                  

                  3.2编译(生成汇编)

                  gcc 首先要检查代码的规范性、是否有语法错误等,以确定代码的实际要做的工作,在检查

                  无误后,gcc 把代码翻译成汇编语言。

                  gcc -S test.c -o test.s
                  

                  3.3汇编(生成二进制的代码)

                  汇编阶段是把编译阶段生成的“.s”文件转成目标文件

                  gcc –c test.s –o test.o
                  

                  3.4链接(生成可执行文件或库文件)

                  在成功编译之后,就进入了链接阶段。

                  gcc test.o -o test
                  

                  3.5静态库和动态库

                  C程序头文件stdio.h中里是函数的声明,并没有定义函数的实现,包下头文件代码能跑的原因是:

                  系统把这些函数实现都被做到名为 libc.so.6 的库文件,在没有特别指定时,gcc 会到系统默认的搜索路径“/usr/lib”下进行查找,也就是链接到 libc.so.6 库函数中去,也就是链接的作用

                  静态库是指编译链接时,把库文件的代码全部加入到可执行文件中,其后缀名一般为“.a”

                  动态库与之相反,在编译链接时并没有把库文件的代码加入到可执行文件中,而是在程序执行时由运行时链接文件加载库,一般后缀名为“.so”

                  动态库优缺点

                  优点:形成的可执行程序体积小,节省资源

                  缺点:强依赖动态库,动态库没了,依赖这个库的程序就无法运行

                  静态库优缺点

                  优点:无视库,可以独立运行

                  缺点:体积太大,浪费资源

                  #C静态库安装
                  sudo yum install -y glibc-static
                  #C++静态库安装
                  sudo yum install -y libstdc++-static
                  

                  4.Linux gdb调试器

                  Linux gcc/g++出来的二进制程序,默认是release模式

                  要使用gdb调试,必须在源代码生成二进制程序的时候, 加上 -g 选项

                  进入:gdb binFile

                  退出: ctrl + d 或 quit

                  调试命令:

                  list/l 行号:显示binFile源代码,接着上次的位置往下列,每次列10行

                  list/l 函数名:列出某个函数的源代码。

                  r或run:运行程序。

                  n 或 next:单条执行。

                  s或step:进入函数调用

                  break(b) 行号:在某一行设置断点

                  break 函数名:在某个函数开头设置断点

                  info break :查看断点信息。

                  finish:执行到当前函数返回,然后停下来等待命令

                  print§:打印表达式的值,通过表达式可以修改变量的值或者调用函数

                  p 变量:打印变量值。

                  set var:修改变量的值

                  continue(或c):从当前位置开始连续而非单步执行程序

                  run(或r):从开始连续而非单步执行程序

                  delete breakpoints:删除所有断点

                  delete breakpoints n:删除序号为n的断点

                  disable breakpoints:禁用断点

                  enable breakpoints:启用断点

                  info(或i) breakpoints:参看当前设置了哪些断点

                  display 变量名:跟踪查看一个变量,每次停下来都显示它的值

                  undisplay:取消对先前设置的那些变量的跟踪

                  until X行号:跳至X行

                  breaktrace(或bt):查看各级函数调用及参数

                  info(i) locals:查看当前栈帧局部变量的值

                  quit:退出gdb

                  5.Linux Makefile项目自动化构建工具

                  make:是一个命令

                  makefile:是一个在当前目录下存在的一个具有特定格式的文本文件

                  mytest:test.c//依赖关系
                     gcc -o $@  $^//依赖方法
                  .PHONY:clean
                  clean:
                     rm -f mytest    
                  

                  mytest($ @)是你要的可执行程序的文件名

                  test.c($^)是要处理的文件

                  .PHONY是伪目标

                  5.1原理

                  makefile和make总是不让我们重新编译代码的

                  设置成伪目标后,依赖方法总是会被执行,不会被任何情况拦截

                  那如果没有设置成伪目标,它是如何进行拦截的呢,其实是通过时间的对比,可以做到不让有些代码进行重新编译(不让某些操作进行)

                  第一次的时候,一定先有源文件,才有bin文件

                  源文件的修改时间

                  第二/n次的时候,我们对源文件做任何修改的时候

                  源文件的修改时间>bin文件的修改时间

                  需要注意的是更改access时间,添加了次数限制

                  一个文件被查看的频率是非常高的,如果说每次都更改access时间,也就是访问磁盘,而Linux充满了大量的访问磁盘的IO操作,会变相减慢系统效率,所以添加了次数限制

                  6.Linux程序进度条

                  6.1缓冲区

                  c/C++语言,会针对标准输出,给我们提供默认的缓冲区,缓冲区并不在操作系统内,而是在内存里

                  #include 
                  int main()
                  {
                      for(int i = 0; i < 10; i++)
                      {
                          printf("data: %d", i);
                          printf("data: %d", i);
                          printf("data: %d", i);
                      }
                      return 0;
                  }
                  

                  这份代码在Linux的gcc编译器执行过,再运行可执行程序是没有输出的,原因在于printf会先输出到c语言的缓冲区中,这里没有对应的刷新缓冲区操作,所以是没有结果

                  #include 
                  int main()
                  {
                      for(int i = 0; i < 10; i++)
                      {
                          printf("data: %d\n", i);
                          printf("data: %d\n", i);
                          printf("data: %d\n", i);
                      }
                      return 0;
                  }
                  

                  加上\n就会有输出结果,因为\n是一种行刷新的策略,回车加换行

                  \r是只回车不换行,也不会刷新缓冲区

                  这里就会引出另一种刷新缓冲区的策略fflush(stdout)这里是强制刷新缓冲区

                  接着stdout标准输出,引出显示器其实是字符设备,显示器上显示的其实是字符,printf(“%d”,a)是格式化输出整形到显示器上去,也就是说printf格式化输出将整形转成了字符输出到显示器上

                  6.2倒计时程序

                  #include  
                  #include
                  int main()
                  {                                      
                  	int cnt=10;
                  	while(cnt>=0)
                  	{
                  		printf("%-2d\r",cnt);
                  		fflush(stdout);
                  		cnt--;
                  		sleep(1);
                  	}
                  	printf("\n");
                  	return 0;
                  }
                  

                  6.3进度条

                  Linux开发工具(个人使用)

                  const char *str="|/-\\";
                  void process_v1()
                  {
                      // version 1
                      int rate=0;
                      //char bar[SIZE] = {0};
                      char bar[SIZE];
                      memset(bar, '\0', sizeof(bar));
                      int num = strlen(str);
                      while(rate <= MAX_RATE)
                      {
                          printf("[%-100s][%d%%][%c]\r", bar, rate, str[rate%num]);
                          fflush(stdout);
                          usleep(STIME);
                          bar[rate++] = STYLE;
                      }
                      printf("\n");
                  }
                  // 不能一次将进度条打印完毕,否则无法平滑的和场景结合
                  // 该函数,应该根据rate,自动的打一次
                  void process_v2(int rate)
                  {
                      // version 2
                      // TODO
                      static char bar[SIZE]= {0}; 
                      int num = strlen(str);
                      if(rate <= MAX_RATE && rate >=0)
                      {
                          printf("[%-100s][%d%%][%c]\r", bar, rate, str[rate%num]);
                          fflush(stdout);
                          bar[rate] = STYLE;
                      }
                      if(rate == MAX_RATE) memset(bar, '\0', sizeof(bar));
                  }
                  void process_v3(double rate)
                  {
                      // version 2
                      static char bar[SIZE]= {0};
                      static int cnt = 0;
                      int num = strlen(str);
                      if(rate <= MAX_RATE && rate >=0)
                      {
                          cnt++;
                          cnt = (cnt >= num ? 0 : cnt); //cnt %= num;
                          printf("加载中... [\033[31;44m%-100s\033[0m][%.1f%%][%c]\r", bar, rate, str[cnt]);
                          fflush(stdout);
                          if(rate < MAX_RATE)
                          {
                              bar[(int)rate] = STYLE_BODY; //'='
                              bar[(int)rate+1] = STYLE_HEADER; //'>'
                          }
                          else
                          {
                              bar[(int)rate] = STYLE_BODY;
                          }
                      }
                      //if(rate == MAX_RATE) memset(bar, '\0', sizeof(bar));
                  }
                  #define TARGET_SIZE 1024*1024 // 1MB
                  #define DSIZE 1024*10
                  //void download()
                  //{
                  //    int target = TARGET_SIZE;
                  //    int total = 0;
                  //
                  //    while(total < target)
                  //    {
                  //        usleep(STIME); // 用简单的休眠时间,模拟本轮下载花费的时间
                  //        total += DSIZE;
                  //        process_v2(total*100/target);
                  //    }
                  //    printf("\n");
                  //}
                  void download(callback_t cb)
                  {
                      int testcnt = 100;
                      int target = TARGET_SIZE;
                      int total = 0;
                      while(total <= target)
                      {
                          usleep(STIME); // 用简单的休眠时间,模拟本轮下载花费的时间
                          total += DSIZE;
                          double rate = total*100.0/target;
                          if(rate > 50.0 && testcnt) {
                              total = target/2;
                              testcnt--;
                          }
                          cb(rate); // 回调函数
                      }
                      cb(MAX_RATE); // 回调函数
                      printf("\n");
                  }
                  // 下载的软件
                  int main()
                  {
                      download(process_v3);
                      return 0;
                  }
                  

                  7.git命令行

                  安装git

                  sudo yum install -y git
                  

                  克隆仓库

                  创建好一个放置代码的目录

                  这里的 url 就是刚刚建立好的 项目 的链接

                  git clone [url]
                  

                  三板斧

                  git add [文件名]
                  git commit . “注释日志”
                  git push
                  

转载请注明来自码农世界,本文标题:《Linux开发工具(个人使用)》

百度分享代码,如果开启HTTPS请参考李洋个人博客
每一天,每一秒,你所做的决定都会改变你的人生!

发表评论

快捷回复:

评论列表 (暂无评论,82人围观)参与讨论

还没有评论,来说两句吧...

Top