欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

【Linux】开发工具

程序员文章站 2022-03-04 18:04:40
...

1.vim的配置

1)简易配置

a.进入root
b.在当前用户的主目录下创.vimrc文件
c.将下面代码粘贴到 .vimrc文件


 “双引号开始的行为注释行,下同

“去掉讨厌的有关vi一致性模式,避免以前版本的一些bug和局限

 set nocompatible

 “显示行号

 set number

 “检测文件的类型

 filetype on 

 “记录历史的行数

 set history=1000 

 “背景使用夜晚模式 //你会很爽的

color evening

 “语法高亮度显示

 syntax on 

 “下面两行在进行编写代码时,在格式对起上很有用;

 “第一行,vim使用自动对起,也就是把当前行的对起格式应用到下一行;

 “第二行,依据上面的对起格式,智能的选择对起方式,对于类似C语言编

 “写上很有用

 set autoindent

 set smartindent

 “第一行设置tab键为4个空格,第二行设置当行之间交错时使用4个空格

 set tabstop=4

 set shiftwidth=4

 “设置匹配模式,类似当输入一个左括号时会匹配相应的那个右括号

 set showmatch

 “去除vim的GUI版本中的toolbar

 set guioptions=T

 “当vim进行编辑时,如果命令错误,会发出一个响声,该设置去掉响声

 set vb t_vb=

 “在编辑过程中,在右下角显示光标位置的状态行

 set ruler

 “默认情况下,寻找匹配是高亮度显示的,该设置关闭高亮显示

 set nohls

 “查询时非常方便,如要查找book单词,当输入到/b时,会自动找到第一

 “个b开头的单词,当输入到/bo时,会自动找到第一个bo开头的单词,依

 “次类推,进行查找时,使用此设置会快速找到答案,当你找要匹配的单词

 “时,别忘记回车

 set incsearch

 “修改一个文件后,自动进行备份,备份的文件名为原文件名加“~“后缀

 if has(“vms”) //注意双引号要用半角的引号" "

 set nobackup

 else

 set backup

 endif
 "自动补全
:inoremap ( ()<ESC>i
:inoremap ) <c-r>=ClosePair(')')<CR>
:inoremap { {<CR>}<ESC>O
:inoremap } <c-r>=ClosePair('}')<CR>
:inoremap [ []<ESC>i
:inoremap ] <c-r>=ClosePair(']')<CR>
:inoremap " ""<ESC>i
:inoremap ' ''<ESC>i
function! ClosePair(char)
    if getline('.')[col('.') - 1] == a:char
        return "\<Right>"
    else
        return a:char
    endif
endfunction
filetype plugin indent on 

2)高级版

https://gitee.com/HGtz2222/VimForCpp

2.编辑器之间的区别和优缺点

  • vim
    vim 是从vi发张出来的一个文本编辑器,代码补全,编译及错误跳转等方便编程的功能特别丰富,在程序员中被广泛使用,和Emacs并列成为类Unix系统用户最喜欢的编辑器

  • Emacs
    Emacs不仅仅是一个编辑器,他是一个整合环境,或可称它为集成开发环境,这些功能如让使用者置身于全功能的操作系统中。Emacs不仅可以作为文本编辑器,还可以用来收发电子邮件、通过FTP/TRAMP编辑远程档案、通过Telnet登录主机、上新闻组、登陆IRC和朋友交流、查看日历等功能

  • eclipse
    eclipse是一款开源代码编辑器,它拥有代码高亮和智能提示等强大的功能,在eclipse中,完全胜任以下编程语言的工作–Python, R, Ruby, JavaScript, Natural, Lasso, C, C++, COBOL, Scheme, Clojure, Groovy等等,它也是Java集成开发环境,甚至提供了对Java 8的支持。在一些Web开发IDE特性的帮助下,你可以非常方便地对代码文件进行组织和访问。

  • Brackets
    Brackets也是一款为Linux开发者设计的开源代码编辑器,使用Brackets写代码,你不会被任何事情所打断。比如在写HTML代码时,即便你没有保存代码也可以及时预览你的Web页面效果。你也可以使用Theseus来检查变量,Brackets默认提供一种主题,当然你也可以在扩展中心获取更多的主题。

  • Light Table
    Light Table是一个免费开放源代码的编辑器,该编辑器有一个非常干净的界面,并有大量扩展。它与Windows、Mac和Linux都兼容,是高度可定制的。使用Light Table,开发者只需打开一个浏览器窗口即可实时查看更改,并且支持不同的嵌入。

  • Chocolat
    Chocolat本身是Mac OS X的最佳代码编辑器。该编辑器旨在与OS无缝集成,Chocolat为JS、Python和HTML提供拖放功能、拆分编辑、代码折叠和代码完成。

  • Sublime Text
    一个紧凑但性能较高的代码编辑器一个跨平台的代码编辑器,适用于所有WordPress项目。
    Sublime Text有很多功能可以提供:
    ·脚本编程  ·自定义界面  ·常规文件切换  ·合成和错误检测  ·多媒体选择和编辑 ·外部插件集成 ·Themes

3.除了gcc, 其他的编译器(不限制编程语言, 不限制平台)

  • MSVC
    Windows平台上最常用的编译器,在C++编译器圣战中的胜利者,一个常被人诟病的是对标准的支持不够新不够快(最近开始逐步加快了)。随着微软发布基于Clang / C2,这一条路以后若成功,MSVC与Clang / C2并行,甚至逐步逐步退出舞台,都是有可能的事情。

  • Clang
    重点介绍。licence极度友好,代码质量非常棒,采用的IR为LLVM IR非常优秀,各大公司逐步发力在Clang上,包括不限于微软,IBM,Nvidia等,各大公司也在开始疯狂的往Clang / LLVM交代码(圈地),也开始往Clang实现OpenMP,Nvidia GPU等支持,目前在赶超GCC的道路上一路激情的狂奔,前途一片光明。但是Clang依赖于的LLVM,目前的性能无法与GCC相提辩论,在Benchmark性能测试上几乎没有胜利的项目,优化的道路上任重道远,同时一些开源软件没有办法编译过去,主要是缺乏对GCC 一些Builtin函数、自身带的汇编器的孱弱导致

  • GCC/G++
    跨体系结构很多,很多开源软件默认编译器都是GCC/G++,这一点上Clang比不上。

  • ICC
    没有自己专门的前端(传说中的外包),而且是针对Intel体系结构上专门优化。

  • IBM XL C++
    在IBM特定硬件与平台上表现非常牛逼,Benchmark性能测试非常优秀,其最初的设计思想就是为了性能,其最高优化级别可以达到O5,带来的缺点则是在编译时间上往往过长。而另外一个常被人诟病的是对C++标准的支持、开源软件的支持、错误信息的提示上都不够友好,然而从13.2开始,随着IBM采用Clang融合方案,目前这几项都得到有效改良,然而融合的道路也必定是漫长的,以前的历史包袱等也需要背上。

4.调试的时候为什么需要编译选项中添加 -g?

用gdb进行调试纠错前必须要在编译选项中添加“-g”,“-g”标志是对程序进行调试性编译时常用的选项。我们需要给每一个需要调试的源文件都加上这个选项。它将使用特殊版本的C语言标准库完成编译和链接操作,给库函数加上程序调试方面的支持。编译器会把这些标志自动传给链接器,加选项-g是为了能够调试。不加可以运行,但不能调试。

5.源码安装,rpm安装和yum安装

(1)yum安装可以看成是从网络在线安装的一种方式,只需要yum install 软件名,系统就自动根据yum源配置文件中的镜像位置去下载安装包了,并可以自动分析所需的软件依赖关系,自动安装所需的依赖软件包。此方式适合初学者,简单方便,不用考虑依赖关系。但有些软件并不能通过yum来安装。

用rpm方式安装软件,如果依赖的软件没有事先安装,软件无法安装成功。

为了解决这个问题,推出yum方式。

既然依赖的软件没有安装在机器上,那么就先安装依赖文件,再安装我需要安装的软件。

因此yum在安装软件同时安装依赖文件。

因此需要一个yum源来放依赖的软件源,对比被安装机器上rpm软件库归根到底,yum也是基于rpm的。

(2)而源码安装方式是需要自己到网上下载源码包,然后解压安装。此方式可以指定配置参数,更加灵活方便,兼容性更强。比较适合对Linux系统有较多了解的进阶用户使用。

 步骤: 编译源码,然后安装
   1.1安装准备:
   a、 首先用yum安装gcc,用于编译源码
   b、管网下载源码包
   c、winSCP windows与Linux传输文件(若直接用安装软件的linux电脑下载就不用传输了)
   1.2 安装过程
   a、解压
   b、进入解压后的目录配置文件  ./configure # 大多数情况下源码包都会带configure这样一个配置工具,具体使用方法可以vim查看其内容
   c、make #编译源码包 如果报错了 make clean 清除缓存重新make
   d、make install # 安装
   然后删除源码包软件和安装目录


(3)rpm是安装本地存在的rpm包,如果存在依赖也需要安装上,如果某个rpm是自己修改编译的,那么只能用rpm安装了

rpm安装:安装别人编译好的软件包

rpm即Redhat Package Manager,Redhat的软件包管方式,适用rpm install 命令

rpm不仅已经把软件源代码编译成二进制文件,而且对软件包依赖的文件,系统环境等做了统计文件扩展名:rpm

还有一种SRPM:没有编译成二进制文件,但是也包含rpm的特性


6.readelf命令.

1)简单了解

readelf命令用来显示一个或者多个elf格式的目标文件的信息,可以通过它的选项来控制显示哪些信息。这里的elf-file(s)就表示那些被检查的文件。可以支持32位,64位的elf格式文件,也支持包含elf文件的文档(这里一般指的是使用ar命令将一些elf文件打包之后生成的例如lib*.a之类的“静态库”文件)。

这个程序和objdump提供的功能类似,但是它显示的信息更为具体,并且它不依赖BFD库(BFD库是一个GNU项目,它的目标就是希望通过一种统一的接口来处理不同的目标文件),所以即使BFD库有什么bug存在的话也不会影响到readelf程序。

运行readelf的时候,除了-v和-H之外,其它的选项必须有一个被指定。

2)命令选项

-a 
--all 显示全部信息,等价于 -h -l -S -s -r -d -V -A -I. 

-h 
--file-header 显示elf文件开始的文件头信息. 

-l 
--program-headers  
--segments 显示程序头(段头)信息(如果有的话)。 

-S 
--section-headers  
--sections 显示节头信息(如果有的话)。 

-g 
--section-groups 显示节组信息(如果有的话)。 

-t 
--section-details 显示节的详细信息(-S的)。 

-s 
--syms        
--symbols 显示符号表段中的项(如果有的话)。 

-e 
--headers 显示全部头信息,等价于: -h -l -S 

-n 
--notes 显示note段(内核注释)的信息。 

-r 
--relocs 显示可重定位段的信息。 

-u 
--unwind 显示unwind段信息。当前只支持IA64 ELF的unwind段信息。 

-d 
--dynamic 显示动态段的信息。 

-V 
--version-info 显示版本段的信息。 

-A 
--arch-specific 显示CPU构架信息。 

-D 
--use-dynamic 使用动态段中的符号表显示符号,而不是使用符号段。 

-x <number or name> 
--hex-dump=<number or name> 以16进制方式显示指定段内内容。number指定段表中段的索引,或字符串指定文件中的段名。 

-w[liaprmfFsoR] or 
--debug-dump[=line,=info,=abbrev,=pubnames,=aranges,=macro,=frames,=frames-interp,=str,=loc,=Ranges] 显示调试段中指定的内容。 

-I 
--histogram 显示符号的时候,显示bucket list长度的柱状图。 

-v 
--version 显示readelf的版本信息。 

-H 
--help 显示readelf所支持的命令行选项。 

-W 
--wide 宽行输出。 

@file 可以将选项集中到一个文件中,然后使用这个@file选项载入。 

3)【转载】

http://man.linuxde.net/readelf

7.使用Makefile完成彩色进度条的实现

Makefile文件:

JinDuTiao:JinDuTiao.c
	gcc -o JinDuTiao JinDuTiao.c
.PHONY:clean
clean:
	rm -f JinDuTiao

函数文件:


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

#define NONE                "\033[m"   
#define RED                 "\033[0;32;31m"   
#define GREEN             "\033[0;32;32m "   
#define BLUE                     "\033[0;32;34m "   
#define CYAN                     "\033[0;36m "   
#define YELLOW                 "\033[1;33m "   
#define PURPLE                   "\033[0;35m "  


void menu()
{
	printf("************************请输入颜色******************************\n");
	printf("************************ 0. 无**********************************\n");
	printf("************************ 1. 红**********************************\n");
	printf("************************ 2. 绿**********************************\n");
	printf("************************ 3. 蓝**********************************\n");
	printf("************************ 4. 蓝绿********************************\n");
	printf("************************ 5. 黄**********************************\n");
	printf("************************ 6. 紫**********************************\n");
	printf("****************************************************************\n");
}
int main()
{
	menu();
	int i = 0;
	char bar[102] = "\0";
	memset(bar, 0, sizeof(bar));
	const char *lable = "|/-\\";
	int color = 0;
	scanf("%d", &color);
	switch (color)
	{
	case 0:
		printf(NONE);
		break;
	case 1:
		printf(RED);
		break;
	case 2:
		printf(GREEN);
		break;
	case 3:
		printf(BLUE);
		break;
	case 4:
		printf(CYAN);
		break;
	case 5:
		printf(YELLOW);
		break;
	case 6:
		printf(PURPLE);
		break;
	default:
		break;
	}
	while (i<=100)
	{
		printf("[%-100s][%d%][%c]\r", bar, i, lable[i % 4]);
		fflush(stdout);
		bar[i++] = '#';
		usleep(100000);
	}
	printf("\n");
	return 0;
}