Linux 版 (精华区)

发信人: netiscpu (说不如做), 信区: Linux
标  题: 集成软件开发环境WipeOut
发信站: 哈工大紫丁香 (Mon May 17 13:22:09 1999), 转信

“Linux 公报...让 Linux 更富魅力!” 

---------------------------------------------------------------------------

-----

集成软件开发环境WipeOut

作者 Gerd Mueller 译者 sams

---------------------------------------------------------------------------

-----

在Linux下编程你可以选择不同的强力开发工具, 像gcc, gdb, make和 更多. 但是他们

大多数是命令行工具, 尤其对于初学者不容易掌握.但 这仅是一方面.另一个重点是源

代码编辑器.多数人中意vi(或者它的同 类) -我倒无所谓.但是有了好的编辑器,编译器

和调试器并不够. 尤其 当你开发更大的软件项目你需要对它们高效组织的工具,应有的

版本控 制和面向对象语言所必需的类浏览器.现在你可以将它们一网打尽. 我 发现有

两条解决途径: (X)Emacs和集成开发环境. 

你能够用Emacs解决将近所有的问题( 也许不久的将来它会为你煮 咖啡;) ). 它不仅是

一编辑器:你能够用它作邮件工具,新闻阅读器,文 件系统浏览器,调试器,编译器和mak

e工具.如果没有特殊需求你完全可 以扩展Emacs以适合你的需要.但是在我看来Emacs并

不是很容易和直接 的作所有的这些事.所以我宁愿选择上面提到的第二种方法. 

从我的理解看集成开发环境把不同的工具集合在相同的环境下并给 出图形界面.此工具

应帮助我组织我的项目及支持code-compile-debug 循环. 其他高级特性包括GUI生成器

,文档工具以及类似CASE工具的行 为。 

在Linux上你可以选择各种不同的IDE.他们有的更强大,有的更便 宜.我这里为你介绍

 的是WipeOut. 

 历史

在开始人们仅仅是想给所有C++程序员的主要开发工具--gcc,gdb, make--生成一个方便

易用的前端工具. 我们决定使用 Julian Smart的 wxWindows [1]进行GUI编程. 第一版

的WipeOut是用wxWindows的 PenLook_variant开发的. 之后由于大多数人都不喜欢Ope

nLook我们改 用了Marcus Holzem的wxXt.我们为基本数据结构(容器类,字符串,及其 他

)开发了dmpack [2]. 这个库也包含了像流对象和远程方法调用这样 的特性,它们对各

个WipeOut元件间通讯至关重要.dmpack的通讯部分是 基于Gnanasekaran Swaminathan

 的能为套接字和管道提供面向对象界 面的socket++库. 

 WipeOut的组件和特性

现在WipeOut对C++,Java,Eiffel,Fortran和C项目( 之后会支持更多语 言)来说是一个

完整的联合作业开发环境.目前包括下列各项组件: 

项目浏览器 -WipeOut主窗口 

版本浏览器 -基于CVS的版本控制,支持远程容器和联合作业 

e3-编辑器 -中心文字编辑器,具有复杂语法醒目性 

类浏览器 -支持Java和C++, 用来作为源代码领航器和交叉引用 

试器 -一 作为gdb/jdb前端,支持线程 

Make-Shell -一 作为make前端,自动产生 makefile 

符号提取器-一对在大量文件中查找符号的grep替换 

冲浪板 -我们显示help和man页面的 HTML浏览器

WipeOut并非一个快速开发工具.这是因为它不是纯的爪哇或者C++ 开发工具. 编辑器,

项目管理和make外壳在其他语言开发时工作得也不 错.此外决定一个对C++部分所必须

的GUI工具箱相当困难. 因此我们尝 试提供程序员们命令行工具的直观前端以及一些对

编程有帮助的附加 组件。 

WipeOut对于不同的平台可用: Linux/i486, Linux/m68k, Linux/Alpha, Solaris, HP

-UX.所有这些版本是完全兼容的,因此你能 够使用WipeOut于多平台开发. 此外也在向

LinuxPPC和Irix移植. 

当前我们提供WipeOut的两个版本: 

自由标准版:此版本对于非商业用途是自由的,但是有限制:没有 版本控制和一项目只能

包含一模块.其他所有组件有全部功能. WipeOutPro版:此版本无限制.商业用户收费$1

49私人用户$79

 安装

安装并不困难.运行WipeOut你需要下列包: 

WipeOut-<VERSION>.tar.gz :包含WipeOut本身 

wxxt-share.tar.gz :这是GUI库 

wipeout-doc-<VERSION>.tar.gz :WipeOut文档 

wipeout-tut-<VERSION>.tar.gz :WipeOut教程

你能够从 [4]获得包.然后进行下列各步: 

创建一新的目录,在此你将安装WipeOut 

复制包到此目录,用'tar xvzf <包>'展开 

键入 './setup'运行设置程序.跟随程序的指示.完成后将要创建

两个shell-scripts:如果你使用bash必须用'source'命令将'wipeout.sh' 包含进你的

'.bashrc'或'.bash_profile',如果用csh则须将'wipeout.csh' 包含进'.cshrc'. 

在用修改过的rc文件启动新shell后,简单的键入'wipeout'就可以 运行WipeOut了。 

 第一步

开始WipeOut时你将看见左边是项目浏览器, 右边是(清空的)编 辑器.项目浏览器是Wi

peOut的核心.这里可以打开项目和开始别的组件. 

我们做的第一件事是创建一新的项目.因此我们选择菜单 '项目->新的根模块'.我们必

须输入CVS容器的目录 (见下文)和我们 的新项目的目录.在确认之后WiepOut要求加入

'Makefile'和 '<arch>.def' 文件,选择确定.这文件意味着什么我们将在以后讨论. 现

在WipeOut 在容器中创立一新的模块并初始化项目目录. 

在创立新的项目之后我们现在可以使用所有别的组件.首先我们 将要看看版本浏览器.

 

 版本浏览器 -部分1

 

版本浏览器管理你的项目的模块和文件.一模块表示一目录并把 文件逻辑地组织起来.

模块能够包含子模块以使你能够建立模块阶层 来表示你的项目. 

版本浏览器在一个叫浏览框的图形元件中显示此阶层. 这是从 NextStep系统中学来的

显示阶层的好方法. 各列表框显示阶层的每 一级.最上的阶层显示在最左的列表框.如

果你选择一项则右边的列 表框包含其子阶层. 使用框左右的箭头按钮你能够滚动阶层

图. 

属于一模块的文件显示在右边的列表框.如果你双击某项则相关 文件将显示于编辑器.

确切的说:文件将按其类别由相应程序打开 (见下文). 

每一模块有各种特性.如果你选择一模块并对于文件或者模块选择 编辑->信息将弹出对

话框,在此能够修改 模块特性.它有下列各表项: 

类别:模块中的文件是划分成类别的. 可按后缀自动分配,也可明确地手工分配.一文件

能够是多类 的成员.类别主要有两种含义: 首先,每个类别表述了一个makefile符号. 

类别的所有文件都 包含在此符号中.用这种方法make知道如何处理一文件. 一实例是 

默认类别'CPP_source'.它包含模块中带有'*.C', '*.cc'和 '*.cpp' 扩展名的所有文

件. 也就是说他们是C++源代码文件. 如果你开始 make一模块,所有此类别的文件将用

c++编译(使用默认C++-编辑器). 其次你能赋予一个或多个程序给一个类别.其中一个是

默认程 序(一般是WipeOut编辑器e3).如果你在文件列表中双击一文件,此 文件将用默

认程序打开.右击一文件你将得到一小的弹出菜单指明 所有通过类别指派的程序.选择

其一则文件将用此程序打开. 目录:除了主目录你能够指派别的目录到一模块. 这些目

录 有下列中一或更多的含义: 源 :调试器寻找源代码的目录 

头文件 :附加头文件的目录 

库 :编译器搜索库的目录 

make :当make一模块时,WipeOut在此进行递归make 

浏览 :类浏览器解析类的目录

模块主目录的缺省特性是 '源'和 '浏览'. 

选项:在这里你能够设置一些附加的 makefile选项.如果你 单击一按钮编辑器将显示'

<arch>.def'文件的相关行.你能够设置 你的编译器,编译器标记,包含文件和库路径,和

希望链接到你的程 序的库. 工具:在这里你能够设置不同的工具性质.目前只有 make-

command特性:可以输入完成你的项目的make命令. 默认当然 是make但你可以改成 gma

ke或者pmake.

---------------------------------------------------------------------------

-----

WipeOut的所见即所得

有一点WipeOut不同于多数别的程序:大多数设置将立刻执行, 不需要显式地保存-真正

的所见即所得.仅仅是在一些模态对话框中 有OK和Cancel按钮,由此你可以选择确认或

者取消.而且你不需要保 存你对某模块特性的改变。例如,如果你增加了一个目录或类

别, 并不需要存盘和关闭对话框,他们对其他组件即可见了。我们认为 这样更快且直

观。 

---------------------------------------------------------------------------

-----

 游戏目标

现在我们知道了一些关于模块和分类.现在应该练习产生代码了. 在我们的实例中我们

将要建立一小的字符串类,当然,包括义不容辞 的 'Hello World'程序. 

创造模块的源代码我们有三种可能: 

旧而好的方式-打开新文件,键入所有代码 

将存在的文件加入模块 

用类浏览器创建类和方法的头.

我们选择最后一种,以使我们能够更近的看看类浏览器.单击项目浏览 器的第三个按钮

来打开类浏览器 

 类浏览器

类浏览器是基于一个渐增源代码语法分析器.也就是说你的代码能 够是不完全的或者错

误的,但是类浏览器将尽可能好的分析其类,方法, 和成员。类浏览器解析你标记为'浏

览'(见上文)的项目目录.当首次建 立起内部数据库后,只有改变的或依赖于改变的文件

以及新文件需要解 析。当且仅当你改变了类或方法的声明时,你需要显式地告诉类浏览

器 更新类阶层(通过Hierarchy->Update或相关工具条按钮)。 

除去著名的浏览框(这里用来观看类阶层),类浏览器还有另外的 WipeOut标准图形元件

-仪表板panelbox。 

开发仪表板是必须的,因为一次又一次太多的非模态对话框显示重 要的信息.这样不利

于观察. 仪表板有清楚的结构,能够在不影响概貌 的情况下快速获得各种信息.仪表板

由子仪表组成. 你可以用顶上的小 按钮指定仪表的数目和类型. 

类浏览器有五种不同的子仪表板: 

方法 :显示当前类的方法 

成员 :显示当前类的成员 

热点列表Hotlist :显示 hotlist (见下文) 

所有类 :显示阶层图的所有类 

所有方法 :显示阶层图的所有方法

hotlist是常用类,方法和成员的集合,使你能快速访问到他们. 用 菜单项热点->加热点

(Hotspots->Add Hotspot)你能够加入当前类, 方 法或者成员.双击热点将在编辑器中

打开相应文件. 其他列表框也是如 此.此外你可以通过键盘控制列表框: 光标键,'Hom

e','End','PageUp' 和 'PageDown',以及数字键.如果你按一字母列表框光标将跳到以

此字 母开始的第一项。 

现在我们希望建立我们的String类:选择Edit->New Class.... 输入类名称并在新文件

中按Insert键.WipeOut将问我们几个问题,只需 全部按OK确认.编辑器现在显示我们的

String类的新头文件. 

下一个步骤是增加一些方法.选择Edit->New Method ...对话框. 象在C++/Java中一样

简单地输入方法的声明,当WipeOut要求将编辑器 光标移到正确位置时,照做即可.在

写好一些实现代码后你的源文件看 起来如下: 

Listing 1

// $Id$

// some comments ...

#ifndef _String_h

#define _String_h

class String {

    protected:

        char* _data;

    public:

                        String(char *);

        virtual         String();

        virtual String& operator= (char *);

        virtual char*   data() const;

    };

#endif

Listing 2

// $Id$

// some comments ...

#include

#include

#include "String.h"

String::String (char *data) {

    _data = new char[strlen(data)+1];

    strcpy (_data, data);

    }

String::String() {

    delete _data;

    }

char* String::data() const {

    return _data;

    }

String& String::operator= (char* data) {

    delete _data;

    _data = new char[strlen(data)+1];

    strcpy (_data, data);

    return *this;

    }

main() {

    String str ("Hello ...");

    cout << str.data() << endl;

    }

由于是用类浏览器产生的类,我们不需要显式更新类阶层.此外类 浏览器自动在版本浏

览器中将文件 'String.h'和 'String.cc' 加到模块中. 

 版本浏览器 -部分2

继续讨论之前我们先为不熟悉版本控制的读者重温一下.容器(在 创立新项目时设置它

的目录)是版本控制的中心数据库.所有的开发者 从这里得到实际的源代码版本.各开发

者拥有本地复制的此版本 (或者 其选择的版本)并能够编辑. 

如果开发者作出提交则文件的本地复制将进入容器.现在所有别的 开发者可以获得此新

版本文件.他们必须更新他们的本地复制.如果一 开发者改变了一文件但是还未提交他

们并更新此文件, CVS将合并本地 复制和实际版本的容器.开发者将不会丢失他的改变

. 在更新之后本地 复制将包含冲突.这意味着开发者的改变和容器的改变相抵触了。在

再 次提交之前,开发者必须解决冲突(在e3的支持下)。 

如果看看版本浏览器的文件清单,你将看见四个文件: 'Makefile', '<arch>.def, 'St

ring.h'和'String.cc'.所有这些项目都以一个'[n]' 开始和空括弧结束.括号里面的符

号有以下含义: 

+ :那文件是最新的 

< :你需要'提交'文件 

> :你需要'更新'文件 

x :可能和别的开发者有冲突 

X :文件内部有冲突 

n :文件是本地增加的 

- :文件是本地删除 

? :状态信息不可用

除了冲突标志外其他符号对于模块有相同的意义. 

文件名之后的括弧包含本地复制的版本.如果我们选择模块并用 Revision->Commit Fi

le(Module),则文件的版本号变成 '1.1'而状态改 变到 '+'. 

尤其在集体开发时文件或者模块的状态会随时改变.有三种方法保持 版本浏览器最新 

(项目->模块性质): 

对于条项:每次你单击一文件或者模块时状态更新 

对于工具:每次你选择工具栏的第一个按钮时状态更新 

计时器时间间隔:每x秒状态更新

注意每次状态更新导致一CVS命令.如果你使用远程容器工作但连接的 可靠性差,推荐选

择第二种方法. 

WipeOut有许多用于版本控制和团队工作的特性,例如你能够创造文件 和模块的版本分

支,你能够合并这些分支重新和你能够赋与版本的象征性名 字(标签).你有各种方法引

进存在的项目(使用或者不使用 CVS).所有这些在 WipeOut文档中都有说明,只要有点

耐心是很容易找到的. 

在编译我们的小项目之前我们来看看编辑器. 

 编辑器

编辑器是WipeOut的中心组件.你使用它编辑源代码,每当另外的组件 必需显示一文件

或者知道源代码位置时也使用编辑器.这是WipeOut的一个基 本概念:唯一的中心编辑器



这导致了编辑器高度集成到开发环境中。所以在WipeOut中不能使用其他 编辑器.这好

像是一大不利因素,因为大部分开发者有他们自己喜欢的编辑器 ,不容易转换到使用

其它编辑器。但是如此可以集成类似符号完成这样的特 征:如果在编辑器中你按 'Ctr

l-.'将会尝试将正在写的字自动完成.为此将使 用类浏览器数据库去查看匹配的类,方

法或者成员名称. 

另外一个漂亮的特征是集成帮助显示器:如果在编辑器中选择一符号并按 'Ctrl-m'将显

示相关帮助(如果有的话) .不久的将来我们将要扩展信息页和 外部HTML文档. 

句法醒目性 

句法元素加亮增加了源代码的易读性.WipeOut编辑器使用规则表达式来 完成.其句法同

'grep'命令的相似. WipeOut的文档包含了对变换符的一般性 展示.这种加亮方式使编

辑器稍慢,但给予你创建自己的加亮风格的弹性. 

一种样式是一组规则表达式,文件模板,颜色和字体.各样式在匹配文件模 板的文件中按

照指定的颜色和字体加亮规则表达式指定的特定句法元素.你能 够用Properties->Hig

hlighting创造和编辑样式. 

编辑器对于 C++,Java, Objective-C,LaTeX和HTML有默认样式.你能够使 用这些样式,

也能够改变他们. 

除了样式还有一些别的参数:不同的颜色,制表符,undo深度,字体大小,及 其他.最后,

编辑器是很容易使用的,因此应该没什么大问题. 

 Make-Shell

现在回到我们的小项目:创建文件,加入他们到模块,使用类浏览器和编辑器 ,是时候编

译程序了. 

WipeOut用make编译项目.一般来说所有必须的文件将基于模块信息自动创 建.各模块有

关于makefile的三个不同的部分: 

Makefile.inc: 包含不同的符号定义, 例如各分类生成包含分类中文件 的符号。make

file使用此符号决定对特定目标哪些文件需要编译. 此文件将由 WipeOut持续更新,你

不应手工编辑。 <arch>.def:包含平台依赖参数. '<arch>'将以OS名替代,如Linux.当

你 用WipeOut跨平台开发时此文件帮助你生成面向平台的特殊编译设置. Makefile:这

是 makefile本身了.包含 'Makefile.inc'和'<arch>.def'. 你可以编辑它.Make-Shel

l将使用此文件调用make。makefile包含默认规则编译 C,C++,Java和混合代码.它可以

生成 C/C++-和 Java目标程序及静态或共享库.为开始make我们使用项目浏览器的第五

按钮打开Make-Shell.此对话框仅有 少量元件:Start按钮开始make,文本框设置特定目

标(为空表示默认目标 - 'cplusplus')和两个复选框.一般地Make-Shell在make完成后

在下面的列表框显 示编译错误和警告.如果我们选择复选框 'All Lines', 在列表框中

将看到所有 make输出。如果我们选择进展窗口,当编译时一个小输出控制台将打开显示

 make输出. 

简单的按开始按钮则编译出我们的程序.结束后错误列表框给出关于虚拟构 造函数的警

告.我们单击警告,编辑器光标跳跃到错误行. 我们看到构造函数应 是析构函数,由此

我们在声明和实现中加上小波浪号.重新编译一切正常. 

为测试我们的程序,我们打开项目浏览器shell,输入我们的模块名称,也 就是程序的

名称.程序输出: 

Hello ... 

下面我们稍微扩展一下我们的项目.为此我们增加两个 方法: 

Listing 3

String& String::operator+= (const String& rhs) {

    char* buf = new char[length()];

    for (int i=0; i<length(); i++)

       buf[i] = data()[i];

    for (int i=0; i<rhs.length(); i++)

       buf[length()+i] = rhs.data()[i];

    delete _data;

    _data = buf;

    return *this;

    }

int String::length() const {

    return strlen(data());

    }

主函数修改如下: 

Listing 4

main() {

    String str ("Hello");

    str += String (" from WipeOut.");

    cout

在编译后运行程序的结果是'Segmentation fault',我们 不知道这是怎么产生的,因此

就用到了调试器。 

 调试器

按项目浏览器第四按钮运行调试器.界面组成和类浏览器相似: browserbox和panelbox

. panelbox 有五个子板: 

Breakpoints 断点 :显示所有的断点 

Stack 堆栈 :显示当前的执行堆栈 

Sources 源 :显示所有程序相关源文件 

Expression 表达式 :显示特定变量表达式 

Threads 线程 :调试线程时用

我们按照需要整理panelbox:点击'plus'按钮,在缺省的'Breakpoints' 和'Stacks'面

板外增加'Sources'面板。 

现在用Session->Load Executable装载程序.之后'Sources'面板将显 示所有程序相关

源文件. 

browserbox用来显示变量值.第一个列表框按缺省显示所有局部变量.单 击某项则显示

它的值或组成。如此你能够轻松浏览类,结构和数组.每一动作 后调试器自动刷新变量

值。 

如果你希望查看目前还不在browserbox中的变量,只需在编辑器中将其标 记并在调试器

的工具栏中选择Inspect Variable即可.现在browserbox的第一 个列表中已包含了此变

量。 

一般来说调试器自动解析数据结构,以使你总是得到正确的值,例如它显示 指针的内容

而不是指针地址本身.但是有时这无法做到,例如如果你用'int**' 声明了一个整型指针

数组,为得到数组每一项你必须用 Inspect->Change/Cast Variable计算其类型. 

用Inspect->Move Variable to Top可以将变量从一较低的级别移动到 顶端,这样你不

需要为得到变量值浏览全部阶层图. 

因为我们不知道程序哪儿错了,首先选择Run->Run开始运行.这将再次导致 'Segmentat

ion fault', 但这回编辑器将错误行标成了红色. 我们发现 String::operator+=方法

有错误. 

在改正错误前应用Run->Kill杀死程序.为了解方法哪里错了我们需要知道 data方法做

什么.我们使用类浏览器作为交叉参考来找到此方法的实现.因此我 们标记data并在类

浏览器中选择Edit->Search Symbol. 现在编辑器显示了 data方法的源代码.我们看见

,此方法没做别的,仅仅是返回_data指针.我们回 到String::operator+= 方法,仔细查

看,意识到我们没有为buf分配足够的内 存.因此修改首行如下: 

       char* buf = new char[length() + rsh.length()];

编译,运行,一切正常. 但是我们看不到输出. 我们用 Inspect->Program Console..

.解决,这样打开一小控制台。重新开始那程序 后,我们看见了输出: 

Hello from WipeOut. 

当然,调试器的特性比以上说的多得多。除了Next,Step和设断点外还支持线 程。再次

推荐阅读相关文档. 

除了符号补偿器和帮助浏览器,现在你已经接触了所有组件,因此你对 WipeOut如何工

作已有了第一印象.当然我们用WipeOut开发了WipeOut,我们 发现这大大增加我们的生

产力,比单用一简单的文字编辑器编程方便得多. 最后讲讲关于扩展WipeOut. 

 编写自己的 WipeOut组件

目前 WipeOut仅仅包含我们认为最重要的元件。有很多其他可能,例如多 数人希望一

个GUI-builder.我们不能也不希望单独做所有的事。因此我们写了 WDK - WipeOut开发

工具箱,让你能开发你自己的组件. 此接口让你能访问到 WipeOut的重要函数, 象在编

辑器中显示文件或者加入文件到一模块. 

如果你喜欢编写这样的组件你只需要从[4]下载WDK包. 除去文档此包还 包含 DmPack2

,socket++, wxXt头文件,一简单的实例组件和 SpellMaster -一 ispell的前端. 

我希望你对WipeOut及其能力已有了一个总体概念.如果你有任何问题,建议 或者希望,

请告诉我们. 

资源

[1] http://web.ukonline.co.uk/julian.smart/wxwin - wxWindows/wxXt by Julian

 Smart and Marcus Holzem[2] ftp://ftp.virginia.edu - socket++ by Gnanasekar

an Swaminathan[3] http://www.softwarebuero.de/dmpack2-eng.html - DmPack2

[4] http://www.softwarebuero.de/wipeout-eng.html - WipeOut 

---------------------------------------------------------------------------

-----

版权?1998, Gerd Mueller

于第30期Linux公报出版, 1998年7月

---------------------------------------------------------------------------

-----

--
☆ 来源:.哈工大紫丁香 bbs.hit.edu.cn.[FROM: bin@mtlab.hit.edu.cn]
[百宝箱] [返回首页] [上级目录] [根目录] [返回顶部] [刷新] [返回]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:202.784毫秒