从windows到*nix(六) 程序开发

 

提纲

 

集成环境

编译器(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出来的信息和你当前系统中的更贴近

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值