提纲
集成环境
编译器(gcc)
调试器(gdb,printf)
依赖管理(make)
搜索代码(grep)
代码编辑器(vim)
代码内跳转(ctag,cscope)
函数和类列表(taglist)
自动补全(^N, ^x^o)
编译错误/代码对应(make+vim)
程序员手册(man)
从这一章开始,要开始讲大家最关心的问题了,就是究竟在*nix下怎么写程序?
下面用公认的开发难度最大的C/C++为例
windows下一般都会使用一个预置的集成环境,例如Visual Studio,*nix下你同样需要一个集成环境,所不同的是,在第一次使用这个集成环境时,你需要多做点工作。根本原因在于集成环境中的每一个部件是由不同的人或组织开发的。
编译器
不管是windows还是*nix,编译器基本上都是命令行工具的集合,这一点很统一,如果你在windows透过图形界面修改过编译选项,那么你很容易理解这一点,虽然各工具的命令行的选项会有区别。一般来说*nix下最常使用的编译器是gcc。
依赖管理
windows下的程序员可能没有接触过这个概念,但是你却每天都在使用,想想当你每次按下编译时,只有你修改过的源文件会被重新编译。而且,你按下的是编译,但是却执行了数个编译命令,包括预处理,编译,链接。
这个过程在*nix下,由make来负责。make解析一个叫Makefile的文件,Makefile中描述了目标、依赖和动作。每当make发现依赖新于目标时,就会调用动作来生成目标。
Visual Studio的早期版本,如VC6也支持make的方式生成程序,可以从工程文件中导出Makefile,现在不知道是不是给改没了。
使用Makefile有一个好处,相比GUI程序管理一个工程文件来说,Makefile有完备的语法,可供程序员手工修改来扩展功能。
Makefile基本结构很简单,如下:
而使用make命令时,是make后面加一个目标名,如果省略目标名,则默认为第一个目标。Makefile中除了可以定义变量,也可以使用预定义变量,例如$(CC)就是一个预定义变量,其值为系统之中默认的C编译器名。除此之外还可以在make命令行中指定变量的值。
下面是一些例子:
Makefile可以使用任意名字来作为目标,但是在约定中,有一些固定的目标名:
all 执行默认动作,省略目标名的时候执行的就是这个
install 执行安装动作
clean 执行清理动作
更多的细节可以去看GNU make的手册。如果你随便找几个开源代码的Makefile看一眼,你就知道手写一份Makefile是一件多么繁琐的事情了,为避免无意义的重复劳动,或者增加记忆负担,可以找一些通用的Makefile模板来应付一些简单工程,我推荐大家在能看懂Makefile之后,放弃手写Makefile,转而使用程序生成,也即学习autoconf,automake的使用,这个下一章再讲。
编码过程
vim还是需要学习的,下面用FAQ的形式罗列一些常用的技巧点滴:
1. 我的vim没有你说的功能呀
请自己从源码编译一个全功能的高版本vim,有些系统上提供的是阉割版的vim。命令行下输入vim --version可以看当前的版本。
2. vimrc的配置好麻烦
在~/.vimrc文件中写入一行
so $VIMRUNTIME/vimrc_example.vim
这是一个预置的配置文件,一般满足大多数人的要求
3. 怎么在文件内查找
第一种方法:/foo<回车>, 然后有结果的话,n 下一个 N 上一个
第二种方法:若光标正停在foo之上,按 * 可以直接查找foo
4. 怎么在多个文件中查找
第一种方法::grep foo * -R
第二种方法::vim foo **/*.[ch]
5. 怎么跳转到函数或结构定义
安装ctags, 把生成tag文件的命令绑定到vim中的某个热键。然后第一次使用时需要按一下热键,以后把光标定位到foo上,按Ctrl+]跳转过去,然后可以试试Ctrl+i和Ctrl+o,一个前进一个后退的
6. 我想看到一个函数和类成员的列表
安装taglist,这是vim的一个插件
7. 上面的taglist使用后多出一个窗口,我不会在窗口间切换
Ctrl+ww切换窗口
ZZ关闭当前窗口
8. 怎么编辑多个文件
:e. 然后你就知道怎么回事了
:bn 当你编辑了多于一个文件时,下一个文件
:bp 上一个文件
同时编辑的文件太多的时候,安装Buffer Explorer,这是vim的一个插件
9. 如何方便的编译和找错误
输入 :make 然后
:cn 下一条错误
:cp 上一条错误
也可以用Ctrl+ww切换到错误窗口,自由浏览
10. 我想暂时离开vim做点事
请使用Ctrl+z,你会回到shell
fg 你会再次回到vim
千万不要傻乎乎的关闭vim,这浪费你很多时间
11. 我知道被windows惯坏了,还是想问一下,如何自动补全
如果想尝鲜可以试试输入一次词一半时,按Ctrl+n,再详细的用法也可以上网查查vim+OMNI补全
不过我用了这么长时间的vim真没怎么用到补全
12. 我想看库函数的原型
如果你知道是什么函数,你可以用man,例如在vim中,可以把光标定位printf上,然后按K,或者回到shell,输入 man printf。特别的,对于像stat这种函数,man出来的是stat命令,你需要输入man 2 stat
如果你不知道是什么函数,google之
man相比google的好处,我觉得有两个:当你知道是什么的时候,man比较快;有些库函数的版本众多,man出来的信息和你当前系统中的更贴近