就C++开发工具而言,与Windows下微软(VC, VS2005等)一统天下相比,Linux/Unix下C++开发,可谓五花八门,各式各样。Emacs, vi, eclipse, anjuta,kdevelop等层出不穷。
Windows下,开发工具多以集成开发环境IDE的形式展示给最终用户。例如,VS2005集成了编辑器,宏汇编ml,C /C++编译器cl,资源编译器rc,调试器,文档生成工具, nmake。它们以集成方式提供给最终用户,对于初学者而言十分方便。可是,这种商业模式,直接致使用户可定制性差,不利于自动化,集成第三方工具的能力弱。例如,没法定制一些宏来处理一些重复操做;体会不到自动化makefile一步到位快感;没法远程登陆到服务器上进行开发;没法使用某种”粘合剂”来把第三方工具(例如,文本工具,字符串工具)有效地调用起来。能够说,良好的商业支持和傻瓜式开发,是它们主要的优势。
在linux下,开发工具被切割成一个个独立的小工具。各自处理不一样的问题。例如,编辑器(emacs, vim)用来进行编辑程序的,调试器(gdb)用来调试程序,编译器(GCC)用来编译和连接程序的,性能分析工具(gcov, gprof)用来优化程序的,文档生成器(doxygen)用来生成文档的。同时,还有一些系统工具和系统知识,咱们是颇有必要了解的:程序自动化机制 makefile,系统粘合剂shell,系统查找工具grep, locate, find。其它的工具(例如ctags, OCI公司的MPC等等),一旦熟练掌握,它们将成为你手中的利器。
本文主要是一些针对LINUX下开发工具使用的经验之谈。因为,工具品种繁多,咱们没有能力也没有必要一一介绍。对于LINUX下IDE工具,例如 eclipse, anjuta等,它们虽然也很实用,可是使用起来比较简单,并且目前还算不上主流。因此,它们将不被着重介绍。同时,本文也不打算写成各个工具的操做手册,只着眼于介绍各个工具的想要解决的问题、运行机理和主要特性。
正文
编辑器
要进行开发,第一件事情就是选择一个合适的编辑器。编辑器选择有几个要素:
1)减小没必要要的编辑动做,减小编辑的时间。
一切可以无二义性描述出来的编辑任务,均可以并且应该能被自动化。例如,每个C++程序都会有一个main函数;咱们在定义.h文件时,都但愿加入一些预处理指令#define来帮咱们解决重复引用同一个头文件而带来的麻烦。鼠标操做老是比键盘操做要慢的。这方面EMACS作得可算是到了极致。因此, EMACS用户常常会吹嘘:他们编辑的速度等同于他们思考的速度。
2)可扩展性高。
程序员预期的编辑器应该能提供一些编程的帮助,例如,语法高亮,自动补齐,自动排版,语法检查等等。留心观察一下gedit, vim, emacs, ultraEdit,就会发现它们提供的远不是windows 记事本,写字板提供的那么简陋的功能。对于一种新的语言,新的语法,它们应该能很方便地提供支持,而不停留在一种或几种固定的语言上。
3)用户可定制性高。
若是想长期从事研发, 特别是linux/unix下研发的话,那么你颇有必要学好一个功能足够的编辑器。有这么一句话:Linux下程序员分为三种,使用emacs的,使用vi的,还有其它。
EMACS是Stallman用lisp语言写的一个GPL的编辑器。咱们这里所说的emacs指的是GNU emacs,而非Xemacs。因为它的开放性,咱们能够把它打形成一个功能强大的IDE。咱们在安装好CGYwin以后,也能够在Windows系统下使用 EMACS。CGYwin和MINGW是第三方写的一个在Windows系统上模拟POSIX系统的工具。
EMACS与其说的是一个编辑器,倒不如说它是一个操做系统。咱们能够用它来写编程,写wiki,收发邮件等等。EMACS主要是经过两种方式来进行扩展:el脚本(elisp是lisp的一种方言)和第三方扩展包。EMACS的入门成本很高。因为是纯键盘操做,因此须要记忆大量的快捷键;功能强大是经过用户添加一些扩展包,lisp脚原本实现的。如何正确配置和修改是很须要耐心和技巧的。
编译器
编译器首选GCC(GNU COMPILER COLLECTION)。缘由有两个,它是GNU开源的,同时它对标准C++的支持度高达96.15%。而VC++6.0的支持度只有83.43%。 GCC不只是一般意义上的C或C++的编译器,它还能够编译java等其它语言。gcc是gnu c的编译器,g++是gnu c++的编译器, 而EGCS(Enhanced GNU Compiler Suite)能够认为是gcc的改进版。
编译语言从源程序到目标代码会通过以下几个阶段:源程序->汇编程序->编译成obj程序->连接成最终可执行程序。咱们能够经过一条编译指令来完成全部步骤。也能够分步执行。gcc有三个重要选项-E(只进行预处理), -S(生成汇编代码), -g(生成带原代码调试符号的可执行文件,若是想用gdb调试的话,就应该在编译时打开这个选项)。
GCC能够看做一个软件包,除了编译工具,它还集成了调试器gdb,性能分析工具gcov, gprof。只要咱们装好了GCC,这些强大工具就能够直接使用了。
经过gcov,咱们能够查看一个程序,源代码中每行代码的运行次数。咱们优化运行次数最多的代码,那么就能够大大优化程序。使用gcov时,须要打开 GCC的fprofile-arcs和ftest-coverage两个选项。gcov中经常使用的选项有-b分支统计信息。
经过gprof工具,咱们能够查看函数之间的调用顺序,及各个函数运行的时间。咱们能够将gprof理解为linux/unix自带工具time的增强版。使用gprof时,须要打开GCC的pg选项。
gcov和 gprof的共同点是在编译程序时,加入本身的一些辅助信息,由此来进行程序诊断。除了,这些优化手段,咱们还可使用一些内存泄漏工具,来减小野指针,未释放的内存空间。
调试器
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这四个工具。
咱们知道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++的。
结束语
国内资料太多的低层次的重复,常常是一个网页被屡次转载,并且回答问题时深度不够。我的找资料的顺序是:查看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下进行实际大规模程序的开发经验,对不少工具和机制的理解还比较肤浅。对它们的熟悉程度离真正实用,还有一段很长的路要走。
我以前是一个C程序员,并且是个Windows的程序员,在windows下使用VC6.0/VS2005等microsoft的傻瓜式工具工做, 对于那个vc 6.0/vs2005的快捷操做,debug操做是那么的熟悉,能够说vc 6.0/vs2005是window下开发c/c++最好用的工具了,能够查看调用堆栈,内存变化状况,变量值,另外安装 visual assist x后让VC看起来是那么的完美。
可是windows下写成代码到了linux下是有问题的,因此建议在vc中将工具-》选项—》制表符—》制表符大小4,插入空格,另外的问题就是 那个回车换行的问题,例如windows下是0d,0a,到了linux下用vi看到的都是^M,给别人带来不便,因此若是提交的服务器是linux,而 你是在windows下开发,能够在svn/cvs中进行设置,就能够自动进行dos2unix的转换,相关的文档能够查看svn/cvs的相关手册,其 中都有这样的设置。
有幸此次我转到了Linux下开发,有幸认识了linux,可是随之而来的就是特别头疼的问题:Linux下使用什么工具进行编码,编译, debug呢??我感到很是的迷茫,而后就是网上大搜索,看到那么多的网友推荐VIM时,我失望了,特别的失望,而后用VIM敲了一个下午,累的手的麻 了,感到特别的不爽,就像是用左手拿筷子同样,全身的力量没法施展,因此 我仍是计划再找找看。不事后来我仍是找到了适合本身的工具。呵呵,真是过高兴了,今天把我本身这几天搜集的一些资料整理一下,给之后转向linux的程序 员一点提示吧!
主要的工具以下:
1. vim + ctags + taglist + cscope + cppcomplete + global
这个我也试过了,比较有用的帖子以下:
http://www.linuxsir.org/bbs/showthread.php?t=241578
http://blog.csdn.net/wooin/archive/2007/10/31/1858917.aspx
可是这个要记大量的命令,不过还好,这些命令有两三天就能够记住了,
我这里有个简单的册子:
二、文本的操做
~
:e! file1 在当前文件下编辑新的文件
:r /etc/passwd 实现文件的读入功能
:wq 保持并退出
:q! 强行退出
O :重起一行
U:撤销 : C-R :重作
dd 删除一行 d$删除行后的
e:移动单词 ge ?—– –à e
%:括号匹配
33G:跳到33行
gg :跳到第一行
C-O /C-I来回跳转
H –HOME L –last
ma :定义标签 a,‘a:回到a
C-V文本块操做
/\
yy :复制一行,p:粘贴
^ 将光标快速跳转到本行的首行字符
$ 将光标快速跳转到本行的行尾字符
:m,ny 复制第m行到第n行之间的文本到VI缓冲区
5.三、替换操做
:s/old/new 替换当前行的第一个字符old为字符new
:s/old/new/g 替换当前行的全部字符old为字符new
:m,ns/old/new/g 替换当前行号m到行号n的全部字符old为字符new
:%s/old/new/g 替换整个文本的全部字符old为字符new
5.七、使用替换的确认功能
:s/old/new/c 替换当前行的第一个字符old为字符new并提示用户确认操做
:s/old/new/gc 替换当前行的全部字符old为字符new并提示用户确认操做
:m,ns/old/new/gc 替换当前行号m到行号n的全部字符old为字符new并提示用户确认操做
:%s/old/new/gc 替换整个文本的全部字符old为字符new并提示用户确认操做
:edit foo.txt —编辑另外一个文档
:next 进行文件切换
C-W 切换窗口
vimdiff main.c~ main.c
:g+//+s/foobar/barfoo/g
CTags:
Ctags –R/ctags *
:set tags =/../tags
:Tlist
F3查找
:make
:cw :cn :cp
mm 标签,F2 切换
cscope –Rbq
:cs add /../cscope.out /../
:cs find g xxx
:cs find c vim_strsave
:cw
按tab键自动补全。
缺点是: 自动补全功能麻烦,必须先创建ctags,写代码仍是很累,我写了一下午,写的手都麻了。出错检查 啊,括号自动匹配啊,
单词补全功能啊,都不满意,另外对C++的支持很差。
好比我刚写了2个config.h,config.cpp,这2个文件
没有进行CTAG,CSCOPE操做,就不能单词补全,括号匹配不能检测,不知道是我配置有问题仍是怎么回事啊。
另外不能进行DEBUG,因此我只能放弃。
2.emacs+插件
能够查看
http://blog.163.com/yu_hongchang/blog/static/3989413820081121512613/
这个我没有试验,估计和vim同样,都是命令操做,据说这个功能强大一些,可以经过xterm进行调试,这个我以前用过,可是那个xterm真的不怎么好用,界面,鼠标,我都不喜欢。
3. kdevelop
这个工具作的比较差劲吧,我也不喜欢,好比他的自动补全功能很不爽,好比:有个函数
Int test(int c1,int c2)
当咱们敲下 tes时,只能出现test,然后面的参数列表都不能显示,因此当代码量比较大,函数参数比较多的时候,咱们都记不住参数,没有参数列表提示,就会以为很不爽。不过还好,它集成了kgdb能够进行debug.
4.eclipse +cdt
好多人用这个IDE,还算好吧,可是eclipse是个java的,运行速度慢的很,另外单词补全功能太差劲了,只能补全结构体或者类,在写下./ ->以后才能补全,另外要按 control+/ 才能补全,不能在敲代码的同时自动显示,eclipse对c/c++的支持远远不如对JAVA的支持强大,可是我至少认为比在vim中写要舒服一些,可能 是我的习惯了那个IDE的工做环境。
5.code::blocks
能够查看:
http://www.codeblocks.org/
支持的平台不全,个人是redhat 企业版 5.0,就安装不上,因此我也没有可以一睹它的芳容,惋惜啊。
6. anjuta
这个我下载了安装不上,不知道为何,并且要求配置的比较多,也比较麻烦,若是你感兴趣,能够看
http://hi.baidu.com/my2008space/blog/item/140de5255fab81084c088d1e.html
7. Kylix
这个没有试。
8.netbeans
这个也不错,我装过试了试,能知足个人功能,可是可定制稍微差点,可是能知足须要了,也还不错吧,若是没有下面要提到的slick edit,我就会选择它了。
9.windows ue+ssh
有不少的人用这个方法,我不太喜欢,多是不喜欢ue那个界面吧,应该和vim之类的相似。
10.slick edit
呵呵,我最终选择的是这个,很好用,可定制性强,支持的语言多,很是的好用,可以直接进行debug,并且速度也很快,界面和vc 6.0很类似,是一个惟一能够和 vc 相媲美的工具,但不是免费的,不过仍是要感谢那些的黑客,让这个软件获得了破解,
你能够经过下面的连接下载:
http://www.slickedit.com/content/view/409/239/
下载SlickEdit v14.0.2.2
而后到http://download.csdn.net/source/1481066
去下载破解的文件,而后覆盖就能够了。
这个工具很是的好用啊,你们能够试一试啊,
这个工具最好的地方就是能够查看memory的状况,这点我喜欢。呵呵
11.编译工具和DEBUG工具
主要的编译工具都是gcc,当代码量大的时候就要写makefile了,另外的调试工具主要都是gdb,这些可视化的IDE基本都是包装了gcc, gdb。因此slickedit对于我这种刚转到Linux,对makefile不熟悉的人来讲无疑是一根救命的稻草,能让我很快的进入工做状态,固然, 你只是把它当成编辑的工具,也会发现它能大大缩小你编码的时间,让你的手不会由于写代码而感到疲惫。
终于尘埃落定,之后我要用slickedit来开始个人Linux之旅了。
1. c/c++编译器 gcc/g++
详情请参考网站:http://gcc.gnu.org/
2. UML建模工具 Bouml
linux下比较好用的建模工具,至关于windows下的rational rose,具成了程序UML模型设计,代码编辑,代码生成功能等功能.
详情请参考网站:http://bouml.free.fr/
3. makefile文件编写工具 :autoconf,automake
不管是在Linux仍是在Unix环境中,make都是一个很是重要的编译命令。无论是本身进行项目开发仍是安装应用软件,
咱们都常常要用到make或 make install。利用make工具,咱们能够将大型的开发项目分解成为多个更易于管理的模块,
对于一个包括几百个源文件的应用程序,可是若是经过查阅make的帮助文档来手工编写Makefile,对任何程序员都是一场挑战。
幸而有GNU 提供的Autoconf及Automake这两套工具使得编写makefile再也不是一个难题
使用make和 makefile工具就能够垂手可得的理顺各个源文件之间纷繁复杂的相互关系,autoconf,automake通常配合libtool使用。
详情请参考网站:
http://www.ibm.com/developerworks/cn/linux/l-makefile/
http://www.gnu.org/software/autoconf/
http://www.gnu.org/software/automake/
http://www.gnu.org/software/libtool/
4. 调试工具:gdb
在window下编程,调试工具已经具成到VS环境,在linux/Unix下调试则经过gdb来调试,我的以为gdb调试比vs调试高效不少。
详情请参考网站:http://www.gnu.org/software/gdb/
5. 内存泄漏工具:valgrind
对于动则成千上万行的代码,很难经过手工的方式去保证内存没有泄漏,
valgrind经过内存申请、释放匹配的原则来检测内存泄漏,内存越界的BUG。固然,良好的编程习惯也是保证代码质量高效必不可少的条件。
参考网站:http://valgrind.org/
6. 源代码管理工具:svn
软件开发再也不是我的大师的年代,都是以团队的方式来开发,如何保证代码的同步,协同开发,svn给咱们提了很好的帮助。
详情请参考网站:http://svncorp.org/
7. 网络协议分析工具:wireshark
编写网络程序,就不可避免要处理网络协议,分析网络数据.wireshark提供了关于网络层和上层协议的各类信息。
命令行下分析网络协议可使用tcpdump.php