linux开发工具

1. vim配置插件.
配置文件的位置:
1)在目录/etc/下面,有个名为vimrc的文件,这是系统中公共的vim配置文件,对所有用户都有效。
linux开发工具
2)而在每个用户的主目录下,都可以自己建立私有的配置文件,命名为:”.vimrc”。例如,/root目录下,通常已经存在一个.vimrc文件,如果不存在,则创建一个。
3)切换到自己用户执行su 名称,进入自己的主工作目录,执行cd 路径
4)打开自己目录下的.vimrc文件,执行vim.vimrc
常用配置选项,用来测试
设置语法高亮:syntax on
显示行号:set nu
设置缩进的空格数为4:set shiftwidth=4
使用插件
要配置好看的vim,原生的配置可能功能不全,可以选择安装插件来完善配置,保证用户是你要配置的用户,接下来:

1)安装TagList插件,下载taglist_xx.zip,解压完成,讲解压出来的doc的内容放到~/.vim/doc,将解压出来的plugin下的内容拷贝到~/.vim/plugin
2)在~/.vimrc中添加:let Tlist_ Show One File=1 let Tlist _Exit _Onlywindow=1 let Tlist _Use _Right _Window=1
3)安装文件浏览器和窗口管理器插件:WinManager
4)下载winmanager.zip,2.X版本以上的
5)解压winmanager.zip,将解压出来的doc的内容放到~/.vim/doc,将解压出来的plugin下的内容拷贝到~/.vim/plugin
6)在~/.vimrc中添加let g:winManagerWindowLayout=’FileExplorer|TagList nmap wm:WMToggle < cr >
然后重启vim,打开~/XXX.c或~/XXX.cpp,在normal状态下输入“wm”,将看到图中效果。更具体移步:点我,其他手册,执行vimtutor命令。

2. 除了vim, 还有哪些常用的编辑器, 并横向对比编辑器之间的区别和优缺点.
vim 和 emacs 分别被称为「 编辑器之神」与「 神之编辑器」。
1)快捷键的无差别延续
vim 和 emacs 诞生于 30 年前,快捷键基本没什么变化。这意味着,一旦你学会使用这两个编辑器,无论以后软件怎么更新,都不需要学习别的快捷键了。因为历史较长,加上快捷键变化不大,新兴编辑器大多提供模拟 vim/emacs 操作的插件。这也方便了用户迁移到其他编辑器,无需学习更多的同质快捷键。
2)基础和适用的默认配置
vim 和 emacs 都可以运行在终端,也有图形化的软件,非常适合快速编辑文件。当需要在无法运行图形界面的服务器上编辑代码的时候,二者也足以胜任。虽然在终端也有 nano 这样的编辑器,但毕竟 too simple ⚯,无法支撑较为复杂的编辑工作。这两个编辑器的默认配置的功能就已经很强大了,语法着色、补全、缩进等功能都很不错。
3)上手难度大默认配置不好看
虽然默认的功能很强大,但不得不说,默认的配色真是难看,相比于 sublime text 和 atom 这样开箱即用又非常美观的编辑器(sublime text 的默认配色在其他编辑器里也很流行,可见一斑),这等于直接拒绝了一批颜控。为了实现强大的功能,vim 选择了多模式编辑(Normal, Insert, Visual 模式),emacs 则选择了复杂的快捷键。这些因素导致了这两个编辑器学习曲线陡峭,使用体验不够友好。
4)vim 和 emacs 的区别
无论是日常感知还是做一些简单的调查,大概都能得出 vim 用户多于 emacs 用户的结论。而且,对大部分 Linux 发行版来说,vim 都是内置的,emacs 则不是。也就是说,某种程度上,vim 比 emacs 更容易被接受。vim 的基础快捷键非常简洁,比如移动的hjklweb,删除的dx,复制粘贴相关的yp,配合 vim 独有的 text object 属性(i 表示 in,a 表示 around),可以组合出非常强大的快捷操作。
emacs 没有输入上的 mode 差别,所以需要依赖复杂的快捷键来实现强大的编辑功能,正如上图所示。emacs 插件想象力更加丰富,有「伪装成编辑器的操作系统」之称。插件的 major mode 和 minor mode 的设计很出彩,对一个文件,只有一个 major mode,但是可以有多个 minor mode,这样一个文件一个主插件,多个附加插件,可以实现很多有趣的效果。在 vim 中,是通过set filetype=python或者在filetype.vim文件中自定义来决定 vim 使用哪种语法渲染,其他比如自动补全这样的插件通过判断filetype来实现相关功能,并没有 mode 一说,针对同一种文件类型的插件可以非常分散。而在 emacs 中,如果我们选中pythonA-mode作为.py文件的 major mode,那么pythonB-mode就不会起作用,除非它上 minor mode。这有利于大而优秀的特定 major mode 脱颖而出,同时使用多个 minor mode 提供通用编辑功能。
https://www.zhihu.com/question/19836903
3. 除了gcc, 还有哪些常用的牛逼的编译器(不限制编程语言, 不限制平台).
Linux 下可用的编译器有 GCC、EGCS 和 PGCC,其中最常用的编译器便是 GCC。
GCC 起初是 GNU 推出的 C语言编译器,用于类 Unix 系统下的编程,所以名为 GNU C Compiler 。随着众多*开发者的加入,GCC 发展迅速,如今已成为一个支持众多语言的编译器了,其中包括 C、C++、Ada、Object C 和 Java 等,以至于 GCC 开始被扩展为 GNU Compiler Collection ,也就是“GNU 编译器集合”的意思。

GCC/G++,跨体系结构很多,很多开源软件默认编译器都是GCC/G++,这一点上Clang比不上。
ICC,没有自己专门的前端(传说中的外包),而且是针对Intel体系结构上专门优化。
Clang,licence极度友好,代码质量非常棒,采用的IR为LLVM IR非常优秀,各大公司逐步发力在Clang上,包括不限于微软,IBM,Nvidia等,各大公司也在开始疯狂的往Clang / LLVM交代码(圈地),也开始往Clang实现OpenMP,Nvidia GPU等支持,目前在赶超GCC的道路上一路激情的狂奔,前途一片光明。但是Clang依赖于的LLVM,目前的性能无法与GCC相提辩论,在Benchmark性能测试上几乎没有胜利的项目,优化的道路上任重道远(但是随着各大公司的疯狂回馈,让人可以看见希望),同时一些开源软件没有办法编译过去,主要是缺乏对GCC 一些Builtin函数、自身带的汇编器的孱弱导致。
MSVC,WIndows平台上最常用的编译器,在C++编译器圣战中的胜利者,一个常被人诟病的是对标准的支持不够新不够快(最近开始逐步加快了)。随着微软发布基于Clang / C2,这一条路以后若成功,MSVC与Clang / C2并行,甚至逐步逐步退出舞台,都是有可能的事情。
BCC,Borland C++,曾经非常流行的C++编译器,然而在C++编译器圣战中失败了,后面也被Borland卖掉了,目前几乎没有听说了。
补充IBM XL C++,前身是VisualAge C++,在IBM特定硬件与平台上表现非常牛逼,Benchmark性能测试非常优秀,其最初的设计思想就是为了性能,其最高优化级别可以达到O5,带来的反噬则是在编译时间上往往过长。而另外一个常被人诟病的是对C++标准的支持、开源软件的支持、错误信息的提示上都不够友好,然而从13.2开始,随着IBM采用Clang融合方案,目前这几项都得到有效改良,然而融合的道路也必定是漫长的,以前的历史包袱等也需要背上。
G++:bug多,修得慢,号称符合标准其实支持的乱七八糟的扩展比VC++还离谱,而且占用内存巨大Clang++:无论是代码的可读性、性能、内存占用还是错误信息比G++好一万倍。搞理论的都喜欢通过给Clang++临时添加低质量的代码来做概念证明,大部分不会进去。MSVC:支持C++/AMP,秒杀其它C++编译器,特别是编译占用的内存啊,在写C++他爹Bjarnet Stroustrup的那种风格的C++的时候,只有Clang++的1/10。写初学者C++程序的时候,跟Clang++占用的内存差不多。
https://www.zhihu.com/question/23789676
4. 为什么调试的时候需要编译选项中添加 -g. 调研readelf命令.
加了-g选项时,是可以通过行号、函数名等进行断点的设置的。
【功能】readelf命令用来显示一个或者多个elf格式的目标文件的信息,可以通过它的选项来控制显示哪些信息。
【描述】这里的elf-file(s)就表示那些被检查的文件。可以支持32位,64位的elf格式文件,也支持包含elf文件的文档(这里一般指的是使用ar命令将一些elf文件打包之后生成的例如lib*.a之类的“静态库”文件)。
这个程序和objdump提供的功能类似,但是它显示的信息更为具体,并且它不依赖BFD库(BFD库是一个GNU项目,它的目标就是希望通过一种统一的接口来处理不同的目标文件),所以即使BFD库有什么bug存在的话也不会影响到readelf程序。
ELF文件类型:

a)可重定位文件:用户和其他目标文件一起创建可执行文件或者共享目标文件,例如lib*.a文件。
b)可执行文件:用于生成进程映像,载入内存执行,例如编译好的可执行文件a.out。
c)共享目标文件:用于和其他共享目标文件或者可重定位文件一起生成elf目标文件或者和执行文件一起创建进程映像,例如lib*.so文件。

ELF文件作用:
ELF文件参与程序的连接(建立一个程序)和程序的执行(运行一个程序),所以可以从不同的角度来看待elf格式的文件:

a)如果用于编译和链接(可重定位文件),则编译器和链接器将把elf文件看作是节头表描述的节的集合,程序头表可选。
b)如果用于加载执行(可执行文件),则加载器则将把elf文件看作是程序头表描述的段的集合,一个段可能包含多个节,节头表可选。
c)如果是共享文件,则两者都含有。

ELF文件总体组成:
elf文件头描述elf文件的总体信息。包括:

系统相关,类型相关,加载相关,链接相关。
系统相关表示:elf文件标识的魔术数,以及硬件和平台等相关信息,增加了elf文件的移植性,使交叉编译成为可能。
类型相关就是前面说的那个类型。
加载相关:包括程序头表相关信息。
链接相关:节头表相关信息。

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

1)读取elf文件头
linux开发工具
解析:
在 readelf 的输出中:

第 1 行,ELF Header: 指名 ELF 文件头开始。
第 2 行,Magic 魔数,用来指名该文件是一个 ELF 目标文件。第一个字节 7F 是个固定的数;后面的 3 个字节正是 E, L, F 三个字母的 ASCII 形式。
第 3 行,CLASS 表示文件类型,这里是 32位的 ELF 格式。
第 4 行,Data 表示文件中的数据是按照什么格式组织(大端或小端)的,不同处理器平台数据组织格式可能就不同,如x86平台为小端存储格式。
第 5 行,当前 ELF 文件头版本号,这里版本号为 1 。
第 6 行,OS/ABI ,指出操作系统类型,ABI 是 Application Binary Interface 的缩写。
第 7 行,ABI 版本号,当前为 0 。
第 8 行,Type 表示文件类型。ELF 文件有 3 种类型,一种是如上所示的 Relocatable file 可重定位目标文件,一种是可执行文件(Executable),另外一种是共享库(Shared Library) 。
第 9 行,机器平台类型。
第 10 行,当前目标文件的版本号。
第 11 行,程序的虚拟地址入口点,因为这还不是可运行的程序,故而这里为零。
第 12 行,与 11 行同理,这个目标文件没有 Program Headers。
第 13 行,sections 头开始处,这里 208 是十进制,表示从地址偏移 0xD0 处开始。
第 14 行,是一个与处理器相关联的标志,x86 平台上该处为 0 。
第 15 行,ELF 文件头的字节数。
第 16 行,因为这个不是可执行程序,故此处大小为 0。
第 17 行,同理于第 16 行。
第 18 行,sections header 的大小,这里每个 section 头大小为 40 个字节。
第 19 行,一共有多少个 section 头,这里是 8 个。
第 20 行,section 头字符串表索引号,从 Section Headers 输出部分可以看到其内容的偏移在 0xa0 处,从此处开始到0xcf 结束保存着各个 sections 的名字,如 .data,.text,.bss等。

在 Section Headers 这里,可以看到 .bss 和 .shstrtab 的偏移都为 0xa0 。这是因为,没有被初始化的全局变量,会在加载阶段被用 0 来初始化,这时候它和 .data 段一样可读可写。但在编译阶段,.data 段会被分配一部分空间已存放数据(这里从偏移 0x6c 开始),而 .bss 则没有,.bss 仅有的是 section headers 。
链接器从 .rel.text 就可以知道哪些地方需要进行重定位(relocate) 。
.symtab 是符号表。
Ndx 是符号表所在的 section 的 section header 编号。如 .data 段的 section header 编号是 3,而string1,string2,lenght 都是在 .data 段的。
2)显示程序头表(目标文件没有该表)
显示程序头表信息,包扩有几个段,每个段的属性,以及每个段中包含有哪几个节(Section)例如:
linux开发工具
3)读取节头表:
显示所有头的信息,包括ELF文件头、程序头和节头,也就是“-h -l -S”的组合。
linux开发工具
http://blog.csdn.net/edonlii/article/details/8779075
http://blog.csdn.net/roland_sun/article/details/37581715
5. 在Linux下实现进度条程序. 通过makefile进行编译.完成一个彩色的进度条.
相关知识
1)缓冲区
一般C库函数写入文件是全缓冲方式,而写入显示器是行缓冲方式,printf、fwrite库函数会自带缓冲区,而我们只要达到了一种缓冲方式我们就可以刷新缓冲区,一般情况下我们有以下缓冲方式:
无缓冲:表示的是没有缓冲,可以将信息立马显现出来,典型代表是标准错误流stderr。
行缓冲:表示的是输入输出遇到换行才执行真正的I/O操作。典型的代表是键盘的操作。
全缓冲:表示的是输入输出写满缓冲区才执行I/O操作。典型的代表是磁盘的读写。
我们在实现一个进度条的时候,如果每次输出符号的时候不刷新缓冲区,就不会立即输出符号,而是进入sleep函数,这样的效果就不好了。所以在每次输出完的时候,都需要用fflush(stdout)刷新缓冲区,以便执行下一次的输出。
2)彩色实现
颜色的实现很简单我们只需要在需要显示颜色的部分输入颜色的编号即可,但是最重要的是我们需要在最后用\033[0m关闭所有属性,不然程序运行后会在运行后的后续文字中也变为你所设置的颜色,但是如果用ls命令,你会发现颜色由恢复原来的样子,因为ls命令有内置的\033[0m代码来关闭所以属性。
颜色的实现主要通过控制符进行一个控制,常见的控制符如下:
linux开发工具
前景色的数字代码:
linux开发工具
背景色的数字代码:
linux开发工具
通过转义序列显示终端的颜色通常以“\033[”开头,以m来表示转义序列结束。在输出完之后要用“\033[0m”来关闭所有属性。下面只列出本次代码所用到的转义属性。
\033[0m ——>关闭所有属性
\033[34m ——>设置前景色为蓝色(30-37为前景色)
3)usleep函数
usleep()函数的功能是把调用该函数的线程挂起一段时间 , 单位是微秒(即百万分之一秒); 头文件: unistd.h 语法: void usleep(int micro_seconds); 在实现过程中我们可以调用usleep()函数来实现每0.1s刷新进度条的现象。
4)程序实现代码如下:
linux开发工具
运行结果如下:
linux开发工具
5)使用makefile编译如下:
第一步:建立makefile文件
linux开发工具
编写如下:
linux开发工具
第二步:执行make
linux开发工具
第三步:执行./28
linux开发工具
6. Linux下软件安装的几种方式(源码安装, rpm安装, yum安装). 阐述rpm安装和yum安装的区别.
1)rpm安装
1>常用选项
操作符
rpm -ivh full_pkgname安装
rpm -e pkgname卸载
rpm -qa [pkgname]列出所有已经安装过的包
rpm -ql pkgname列出一个已经安装的包安装了哪些文件
rpm -qf file列出某个文件由哪个包安装
rpm -qi file查询某个安装包的详细安装信息
rpm –nodeps强制安装,而不用管其依赖的包
rpm –force强制安装,而不管系统中有没有安装过这个包
2>安装过程
rpm包安装方式步骤:
第1步——找到相应的软件包,比如soft.version.rpm,下载到本机某个目录;
第2步——打开一个终端,su -成root用户;
第3步——cd soft.version.rpm所在的目录;
第4步——输入rpm -ivh soft.version.rpm
详细介绍:
a> 安装:
  执行:
  rpm –ivh rpm的软件包名
  更高级的,请见下表:
  rpm参数 参数说明
  -i 安装软件
  -t 测试安装,不是真的安装
  -p 显示安装进度
  -f 忽略任何错误
  -U 升级安装
  -v 检测套件是否正确安装
  这些参数可以同时采用。更多的内容可以参考RPM的命令帮助。
b>卸载:
  执行:
  rpm –e 软件名
  不过要注意的是,后面使用的是软件名,而不是软件包名。例如,要安装software-1.2.3-1.i386.rpm这个包时,应执行:
  rpm –ivh software-1.2.3-1.i386.rpm
  而当卸载时,则应执行:
  rpm –e software。
另外,在Linux中还提供了象GnoRPM、kpackage等图形化的RPM工具,使得整个过程会更加简单。

2)yum安装
1>概述
yum工具是RedHat公司开发的用于管理rpm包的工具
使用 yum 安装 rpm 包可以自动解决包之间的依赖关系
我们可以自定义 yum 的源,可以搭建本地 yum 仓库
yum 源配置文件为 /etc/yum.repos.d/CentOS-Base.repo
2>常用选项
yum install pkg 安装rpm包
yum remove pkg 卸载rpm包
yum list 从配置文件中指定的yum源列出所有的rpm安装包
yum search xxx 搜索rpm包
yum groupinstall grp 安装rpm组件
yum groupremove grp 卸载rpm组件
yum grouplist 列出所有的rpm组件
yum update / yum upgrade 更新所有的rpm包
3>搭建本地 yum 仓库
第1步——将CentOS安装盘或安装镜像挂载到指定路径,如/mnt/
第2步——备份好配置文件 /etc/yum.repos.d/CentOS-Base.repo到一个指定路径
第3步——删除配置文件 /etc/yum.repos.d/CentOS-Base.repo
第3步——编辑另一个配置文件 /etc/yum.repos.d/CentOS-Media.repo
[local-cdrom] —-> yum list 时显示在最右边的标识
name=cd —-> yum 仓库标识
baseurl=file:///mnt/ —-> 指定 rpm 仓库路径
gpgcheck=0 —-> 不检测
enabled=1 —-> 允许
第5步——保存退出
4>使用 yum 只下载不安装 rpm 包
先安装一个插件:yum install -y yum-plugin-downloadonly
对于未安装过的 rpm 包:yum install -y pkg –downloadonly
对于已经安装过的:yum reinstall -y pkg –downloadonly
指定 rpm 包的下载路径:yum install -y pkg –downloadonly –downloaddir dir
3)源码安装
1>注意事项
a.下载源码包尽量从官网下载,保证安全
b.源码包保存路径约定为:/usr/local/src/
c.安装路径约定为:/usr/local/源码包名
d.安装开始前,先要查看安装说明 vim INSTALL vim README
e.查看配置参数:./configure –help
f.安装过程中,每进行完一步要使用echo $? 进行验证前一步是否产生错误

2>安装过程
第1步——./configure –help 查看所有配置参数及含义
第2步——./configure … 配置安装路径、安装模块
第3步——make 编译
第4步——make install 安装
第5步——echo $! 检查上一步安装是否出错,‘0’:正确;‘1’:错误
4)rpm和yum区别:
rpm 是linux的一种软件包名称,以.rmp结尾,安装的时候语法为:rpm -ivh。
rpm包的安装有个很大的缺点就是文件的关联性太大,有时装一个软件要安装很多其他的软件包,很麻烦。
所以为此RedHat小红帽开发了yum安装方法,他可以彻底解决这个关联性的问题,很方便,只要配置两个文件即可安装,安装方法是:yum -y install 。
yum并不是一中包,而是安装包的软件
简单的说: rpm 只能安装已经下载到本地机器上的rpm 包. yum能在线下载并安装rpm包,能更新系统,
且还能自动处理包与包之间的依赖问题,这个是rpm 工具所不具备的。
http://blog.csdn.net/u010509774/article/details/50593231