Linux系统C++开发工具

 

 

概述

就C++开发工具而言,与Windows下微软(VC, VS2005等)一统天下相比,Linux/Unix下C++开发,可谓五花八门,各式各样。Emacs, vi, eclipse, anjuta,kdevelop等层出不穷。

本文主要是一些针对Linux下开发工具使用的经验之谈。由于,工具品种繁多,我们没有能力也没有必要一一介绍。对于Linux下IDE工具,例如 eclipse, anjuta等,它们虽然也很实用,但是使用起来比较简单,而且目前还算不上主流。所以,它们将不被着重介绍。同时,本文也不打算写成各个工具的操作手 册,只着眼于介绍各个工具的想要解决的问题、运行机理和主要特性。

编辑器

Linux下开发还可以更友好一些。个人感觉, Linux开发要在国内普通程序员中大规模普及,还有一段很长的路要走。Ubuntu火 爆的主要原因,就是它帮用户搭好一些默认配置。用户如果想新加一些 服务,它们提供了良好,有效地支持。所以,我想我们可以在IDE和现在Linux这种一个个小部件的这两种状态之间,取一个折衷。也就是针对几种主要需求 的用户,发布一些配置好的环境。尤其是emacs的各种el脚本(例如界面主题的color-theme, C/C++语言编辑策略,代码样式设置脚本,各种emacs系统设置), 第三方扩展包(模板template, 编程支持包cedet等)。每一个用户浪费时间来进行这些配置是十分没有意义的!工具始终只是工具,我们不能沦为工具的奴隶,不能把一大部分精力浪费在配 置工具上。

值得注意的是现在方兴未艾的eclipse有向这方面迈进的趋势。但是,现在emacs已经做得很好了,ecilpse能否超越它,我们还有待观察。我们 可以通过在eclipse上安装SDT插件来进行C++开发。但是,它目前还不支持调试功能,而且不太稳定,功能不够强。例如,有时会无故死掉;如果想通 过eclipse来转向函数原型的话,那么迎接你的将是一个漫长、焦急的等待。

由于本人缺少在Linux下进行实际大规模程序的开发经验,对很多工具和机制的理解还比较肤浅。对它们的熟悉程度离真正实用,还有一段很长的路要走。

编译器

Linux下开发还可以更友好一些。个人感觉, Linux开发要在国内普通程序员中大规模普及,还有一段很长的路要走。Ubuntu火 爆的主要原因,就是它帮用户搭好一些默认配置。用户如果想新加一些 服务,它们提供了良好,有效地支持。所以,我想我们可以在IDE和现在Linux这种一个个小部件的这两种状态之间,取一个折衷。也就是针对几种主要需求 的用户,发布一些配置好的环境。尤其是emacs的各种el脚本(例如界面主题的color-theme, C/C++语言编辑策略,代码样式设置脚本,各种emacs系统设置), 第三方扩展包(模板template, 编程支持包cedet等)。每一个用户浪费时间来进行这些配置是十分没有意义的!工具始终只是工具,我们不能沦为工具的奴隶,不能把一大部分精力浪费在配 置工具上。

值得注意的是现在方兴未艾的eclipse有向这方面迈进的趋势。但是,现在emacs已经做得很好了,ecilpse能否超越它,我们还有待观察。我们 可以通过在eclipse上安装SDT插件来进行C++开发。但是,它目前还不支持调试功能,而且不太稳定,功能不够强。例如,有时会无故死掉;如果想通 过eclipse来转向函数原型的话,那么迎接你的将是一个漫长、焦急的等待。

由于本人缺少在Linux下进行实际大规模程序的开发经验,对很多工具和机制的理解还比较肤浅。对它们的熟悉程度离真正实用,还有一段很长的路要走。

调试器

GDB即GNU的调试器,它是GCC附带的一个性能优质的调试器。通过GDB和脚本结合,我们可以很好的实现回归测试。

GDB可以运行于CLI和GUI两种模式。默认GDB是CLI模式的,我们可以去下载和安装GUI模式的GDB,例如xxgdb, ddd等。一个更好的方式是在 EMACS中使用GDB。GDB包括visual studio工具的所有调试功能,还 包括它没有的功能。它除了支持,我们一般的设置断点,单步跟踪,step in, step out, step over等,还有一些强大的功能。在gdb中,我们可以有以下几种暂停方式:断点(BreakPoint)、观察点(WatchPoint)、捕捉点 (CatchPoint)、信号(Signals)、线程停止(Thread Stops)。

下面列举几个让我印象深刻的功能。1)通过 watch指令,可以让程序在某个变量的值发生变化时,暂停下来。2)通过print指令,在程序运行时,设置变量的值,运行一个程序自身支持的一个方 法。3)通过until指令,我们可以让程序在运行到某个程序时暂停下来。4)通过break.. if指令,使得程序在满足某个bool表达式时,暂停下来。

 

粘合剂

我想通过”粘合剂”这个词来表达将多个工具粘合起来的”胶水”。例如,通过shell脚本,我们可以把OS命令,sed指令,awk指令,其它脚本文件等 串联起来,发挥它们的合力。在Linux C++编程中,我们不可避免地会使用makefile文件。通过,它我们可以把编译指令,生成文档操作,清除操作等等串联起来。从某种意义上来看,它也相 当于一个粘合剂。

makefile的出发点是,维护好一个项目中众多文件的依赖关系,由此得到一个源程序的拓扑图。当我们只修改图中某个结点时,重新编译时就只需要将拓扑 图中关联的链路进行编译就好了。由此,大大缩短了编译的时间。make有两大概念:dependencies和rules。规则rule即针对每一个依赖 关系 dependency定义一个操作规则。这个细粒度的分离,就可以使我们可以定制软件构建的行为。例如,修改使用的编译器,修改includepath, 修改libpath, 修改编译选项等等。我们常见的VC中的nmake,功能和make是类似的。

make使用的重点和难点是编写Makefile文件。Makefile的语法相对其它语言来说是很不一样的,我们要特别注意TAB键和空格键的区别。有 很多工具可以用来帮助我们生成Makefile。最出名的就是GNU的autoconf了。一个GNU程序的编写,需要autoscan, aclocal, autoconf, automake这四个工具。

 

结束语

国内资料太多的低层次的重复,经常是一个网页被多次转载,而且回答问题时深度不够。个人找资料的顺序是:查看quick start或how to文档->自带的帮助(如果看起来不太吃力话)->百度查一下中文网页,来理清一下基本概念->google查一下->几个大的,相关的网站查下资料 ->看自带帮助。再者,面对面的交流是十分重要的,大家可以相互理一下概念,交流一下心得。可惜,我身边这种氛围还是不够。

Linux下开发还可以更友好一些。个人感觉, Linux开发要在国内普通程序员中大规模普及,还有一段很长的路要走。Ubuntu火 爆的主要原因,就是它帮用户搭好一些默认配置。用户如果想新加一些 服务,它们提供了良好,有效地支持。所以,我想我们可以在IDE和现在Linux这种一个个小部件的这两种状态之间,取一个折衷。也就是针对几种主要需求 的用户,发布一些配置好的环境。尤其是emacs的各种el脚本(例如界面主题的color-theme, C/C++语言编辑策略,代码样式设置脚本,各种emacs系统设置), 第三方扩展包(模板template, 编程支持包cedet等)。每一个用户浪费时间来进行这些配置是十分没有意义的!工具始终只是工具,我们不能沦为工具的奴隶,不能把一大部分精力浪费在配 置工具上。

值得注意的是现在方兴未艾的eclipse有向这方面迈进的趋势。但是,现在emacs已经做得很好了,ecilpse能否超越它,我们还有待观察。我们 可以通过在eclipse上安装SDT插件来进行C++开发。但是,它目前还不支持调试功能,而且不太稳定,功能不够强。例如,有时会无故死掉;如果想通 过eclipse来转向函数原型的话,那么迎接你的将是一个漫长、焦急的等待。

由于本人缺少在Linux下进行实际大规模程序的开发经验,对很多工具和机制的理解还比较肤浅。对它们的熟悉程度离真正实用,还有一段很长的路要走。

我们知道GNU软件安装的三步曲是:./configure, make, make install。其中./configure就是根据autoconf, alocal等工具生成一个makefile文件。make指令就是调用make指令来根据makefile文件的规则来编译源程序。而make install就是执行makefile中的install规则指出的操作(一般是copy操作)。而make clean就是执行makefile中的clean规则指出的操作(一般是rm操作)。我们用Eclispe+CDT开发Managed C++ Project时,它就是通过objects.mk,subdir.mk,sources.mk三个文件来生成Makefile。我们注意观察编译时的输 出信息,就可以看到显示的Makefile文件的内容。

可以说,如果想编译出跨平台的C++程序,那么makefile是一种最方便的机制。

OCI公司为Douglas C.Schmidt的ACE,TAO开源社区编写了一段伟大的perl脚本--MPC。它由平台信息,一个规则文件,源代码,生成用户想要的工程文件,例 如Make, Nmake, Visual C++ 6, Visual C++ 7等等。Google Web Tookit, Celtix做的事情与之类似,不过它们是针对JAVA的,而MPC是针对C++的。

你可能感兴趣的:(Linux系统C++开发工具)