Vim与其他编辑器之间的对比
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特性的帮助下,你可以非常方便地对代码文件进行组织和访问
gcc与其他编译器之间的对比
Clang
licence极度友好,代码质量非常棒,采用的IR为LLVM IR非常优秀,各大公司逐步发力在Clang上,包括不限于微软,IBM,Nvidia等,各大公司也在开始疯狂的往Clang / LLVM交代码(圈地),也开始往Clang实现OpenMP,Nvidia GPU等支持,目前在赶超GCC的道路上一路激情的狂奔,前途一片光明。但是Clang依赖于的LLVM,目前的性能无法与GCC相提辩论,在Benchmark性能测试上几乎没有胜利的项目,优化的道路上任重道远,同时一些开源软件没有办法编译过去,主要是缺乏对GCC 一些Builtin函数、自身带的汇编器的孱弱导致
ICC
全称Intel C++ Compiler,是Intel开发的C/C++/Fortran编译器套装,适用于Linux、Microsoft和Mac OS X操作系统,没有非IA指令集版本(就是说仅供x86架构CPU使用)。ICC广泛应用于高性能计算、分布式计算等商业计算领域,其向量化和并行化性能是业界的标杆,能够充分发挥现代处理器的特性
1.编辑器之Vim
Vim是从 vi 发展出来的一个文本编辑器。默认的配置一般是不能满足人们的要求的,所以得自己配置,这些配置通常包括了项目结构列表,文件结构列表,自动跳转,自动提示和补全,插件管理,语法检查,版本控制等插件 Vim配置成属于自己的IDE: 打开/etc目录下vimrc 或 用户目录下vimrc均可修改 前者是修改系统Vim配置,所有用户都可以使用这个配置 后者是修改用户Vim配置,用户优先使用用户目录下的配置 可以网上查找下载相关的配置压缩包(解压缩包的命令之前的博客里有) Vim总共有12种操作模式,常用的有3种: 普通模式 插入模式 行末模式
Vim操作:
进入普通模式 : " esc "
进入插入模式 :
i 插入到光标前 I 插入到行首 a 插入到光标后 A 插入到行尾 o 向下新开一行插入行首 O 向上新开一行插入行首
进入行末模式 : " : "
shift + : w 存盘 wq 存盘退出 q! 不存盘退出
光标移动(普通模式下)
h 左移 j 下移 k 上移 l 右移 M 移动到中间行 L 光标移动到屏幕最后一行行首 ^ 光标移动到当前行行首 I 光标移动到当前行行首并进入插入模式 $ 光标移动到当前行行末 A 光标移动到当前行行末并进入插入模式 G 移动到指定行,行号 + shift + g w 向后一次移动一个字 b 向前一次移动一个字 { 按端移动,上移 } 按端移动,下移
翻屏(普通模式下)
ctrl + d 向下翻半屏 ctrl + u 向上翻半屏 ctrl + f 向下翻一屏 ctrl + b 向上翻一屏 gg 光标移动文件开头 G 光标移动到文件末尾
gg 到行首,按=,shfit + g 所有代码自动排版
删除命令(普通模式下)
x 删除光标后一个字符 X 删除光标前一个字符 dd 删除整行, n dd 删除指定的行数 D 删除光标后本行所有内容 d0 删除光标前本行所有内容,不包含光标所在字符 dw 删除光标开始位置的字,包含光标所在字符
撤销命令(普通模式下)
u 一步步撤销 U 一次性撤销当前行所有操作 ctrl + r 反撤销
重复命令(普通模式下)
文本行移动(普通模式下)
复制粘贴(普通模式下)
YY 复制当前行 n yy 复制n行 p 在光标所在位置向下新开辟一行,粘贴
可视模式(普通模式下)
v 按字符移动选中文本 V 按行移动,选中文本可视模式可以配合d,y,>>,<<操作
替换操作(普通模式下)
分屏操作(行末模式)
sp 上下分屏,后可缀文件名 vsp 左右分屏,后可缀文件名 ctrl + w + w 再多个窗口切换 执行shell下命令 行末模式里输入!,后面跟命令
启动分屏
vim -On file vim启动时左右分n个屏 vim -on file vim启动时上下分n个屏
关闭分屏
ctrl + w c 关闭当前窗口 ctrl + w q 关闭当前窗口,若只剩最后一个则退出vim
设置分屏距离
ctrl + w n >> 当前窗口拓宽n个单位 ctrl + w n << 当前窗口缩小n个单位
查找命令
查看命令
shfit + k 光标移动到函数上,查看配置 行末模式下: set nu 显示行号 set nonu 关闭显示行号 :! man 章节数 函数名 vim下查看第几章的什么函数,按q返回vim
编译器之gcc
gcc / g++ : 编译器 gcc : 功能 将c/c++高级语言代码翻译成机器可识别代码 编译过程: 预处理 : 展开所有代码 编译 : 语法语义纠错,翻译成汇编代码 汇编 : 将汇编代码翻译成二进制机器可识别指令 链接 : 链接库,将所有代码合到一起生成可执行程序 库文件 : 已经汇编完成的公共代码 链接 : 将库中的代码拿到要生成的可执行程序中 静态链接 : 链接静态库, 将库中的代码直接拷贝到可执行程序中,好处是程序运行时不依赖库文件的存在,缺点是占用资源较多 动态链接 : 链接动态库, 只是记录库中的接口符号位置信息,好处是资源占用冗余较小,缺点是程序运行时需要动态库的存在 gcc默认链接方式 : 动态链接
gcc命令:
-v 查看gcc版本号 -I 指定头文件目录,后面紧跟其他命令,gcc -I./include main.c dict.c -o app -g 包含调试信息 -On n=0~3 编译优化,n越大优化越多 -Wall 提示更多警告信息 -D 编译时定义宏,后面紧跟其他命令 -E 生成预处理文件 -M 生成.c文件与头文件依赖关系以用于Makefile,包括系统库的头文件 -MM 生成.c文件与头文件依赖关系以用于Makefile,不包括系统库的头文件
静态库:
创建一个静态库,或将目标代码加入到已存在的静态库中: ar rcs libmylib.a file.o 命名以lib开头,后面跟库名.a nm libmyab.a 查看静态库
动态库(共享库):
共享库: gcc -fPIC -c a.c -fPIC : 生成与位置无关的代码 -c : 只编译生成.o文件,不进行链接 gcc -fPIC -a b.c gcc -shared -Wl -o libmyab.so a.o b.o gcc -share -Wl,-soname,libmyab.so.1 -o libmyab.so.1.0.1 a.o b.o 生成libmyab.so.1.0.1 注意问题: 引入包含以上四个函数声明的头文件并如下方式编译 gcc main.c libmycal.so.1.10 -o app 成功生成app却无法运行 使用ldd app 命名查看app运行需要依赖哪些库,显示libmyab.so.1 not found sudo vim /etc/ld.so.conf 添加库的路径 sudo ldconfig -v 更新配置 再次./app即可成功运行 soname 和 linkname 的区别: soname 记录了库的主版本号,可以通过对比app的库主版本号判断是否可以在对应的机器上运行 soname是一个符号链接 在编译链接阶段使用: linkname 没有版本信息只是表明了库的名字,顾名思义在app运行时会链接linkname找到真正的库 linkname不关注版本信息,在改变库版本后只需将linkname指向新的版本库即可,不用对Makefile的内容进行修改
动态库&静态库的优缺点
静态库与app编译在一起,在任何Linux系统下都可运行,但是代码体积很大共享库在其他机器上能否运行,取决于该机器是否存在app所依赖的库和该库的版本号,优点是代码体积小
调试器gdb
功能 : 调试一个程序的运行过程 Linux 下程序编译默认生成release版本程序,不带有调试符号信息,意味着程序无法被调试所以程序调试的前提是编译生成debug版本程序,因此gcc编译程序时要加上-g选项,开启调试,向程序中添加调试符号信息 用gdb进行调试纠错前必须要在编译选项中添加“-g”,“-g”标志是对程序进行调试性编译时常用的选项。我们需要给每一个需要调试的源文件都加上这个选项。它将使用特殊版本的C语言标准库完成编译和链接操作,给库函数加上程序调试方面的支持。编译器会把这些标志自动传给链接器。 readelf命令用来显示一个或者多个elf格式的目标文件的信息,可以通过它的选项来控制显示哪些信息。这里的elf-file(s)就表示哪些被检查的文件。可以支持32位,64位的elf格式文件,也支持包含elf文件的文档(这里一般指的是使用ar命令将一些elf文件打包之后生成的例如lib*.a之类的“静态库”文件)。这个程序和objdump提供的功能相似,但是它显示的信息更为具体,并且它不依赖BFD库(BFD是一个GNU项目,它的目标就是希望通过一种统一的接口来处理不同的目标文件),所以即使BFD库有什么bug存在的话也不会影响到readelf程序。运行readelf时,除了-v和-H之外,其他的选项必须有一个被指定
yum安装
yum工具 进行软件安装 yum : 软件包管理工具 软件安装的方法: 1. 手动安装 : 从官网上下载源码,在自己的机器上编译,由于 各种可能的依赖项,版本不同,会导致安装繁琐,效率差甚至根本安装不了 2. 使用工具安装 : 工具自身可以解决软件包安装的依赖关系,方便使用,效率高 yum 常用操作: 查看 : 查看能够安装什么 yum list yum list | grep package_name 查看已经安装了什么 yum list installed | grep package_name 安装 : yum install package_name 移除 : yum remove package_name
rmp安装
linux下的安装包多为rpm安装包。通常安装方法为: rpm -ivh 包的路径+包名.rpm 其中参数-i为安装 -v显示信息 -h显示进度条。这三个参数基本捆绑使用rpm的路径不单可以是本地磁盘也可以是ftp服务器的目录。 rpm安装的缺点在于很多安装包有依赖性装一个包就带连带着装其他包,大包套小包。当然也有相应的参数来对应
两者的区别
相比rpm安装来讲yum的安装更人性化。 yum安装不用考虑依赖关系因为他会将软件包涉及到的所有依赖包都找到并安装。如果电脑连入网络它会更方便的从网络寻找依赖关系。而且不用考虑软件路径,因为yum软件会通过下载源文件来找对应的软件