基于于berkeleydb+qt的智能语音电话薄管理系统

/****************************************************************************

文档作者:罗国辉

软件代码:罗国辉,廖少龙

本文目地:指导大家掌握几点:1.QT编程入门,2.espeak语言库的使用与编程入门,3。berkeleydb使用与编程入门,4.linux C编程,5,嵌入式开发流程

****************************************************************************/

摘  要

        智能语音电话薄管理系统是一个可运行在几乎所有视窗操作系统(包括嵌入式操作系统)的通讯录软件,采用了语音合成技术,能够智能播报相关信息。它以qtopia作GUI开发(包括其中的输入法开发),以Berkeley db作为数据库,并加入了改进的TTS语音库,能够实现对常用联系人的资料管理,包括:添加,查询,修改,删除联系人信息等主要功能。以一种创新的角度实现了嵌入式设备上的信息管理系统,由此,可以很好的实现移动设备上的信息管理,具有很大的实际意义。

 

关键词:Arm;Linux;QT; qtopia;QT/E;TTS;Berkeley DB;电话薄; 智能语音

Abstract

Intelligent voice management system of phone book is a run on almost all GUI operating system (including the embedded operating system), Address Book software, using voice synthesis technology to read the relevant intelligence information. It uses QT for GUI development (including the input method development), Berkeley db as a database, and joined the improvement of the TTS voice, to achieve the common contact information management, including: add, query, modify and delete links Information, and other major features. It was an innovative perspective to achieve the embedded devices on the information management system, which can achieve very good on mobile devices for information management, and it has great practical significance.

 

Keywords:Arm;Linux;QT;qtopia;QT/E;TTS;BerkeleyDB;phonebook;ntelligent voice

 

 

目 录

第1章 绪论

1.1 目前基于嵌入式设备的信息管理系统现状

1.2 软件开发背景

 

第2章 系统方案

2.1软件整体设计方案

2.2 搭建主机-宿机开发环境

2.3 建立tools Chain交叉编译环境

2.4 搭建qtopia交叉编译开发环境

2.5 构建Berkeley db 交叉编译开发环境

2.6 创建TTS语音库

2.7 移植软件依赖库与依赖文件

 

第3章功能与指标

3.1 软件主要功能

3.2 软件设计主要指标

 

第4章 实现原理

4.1 基于qtopia的设计

4.2基于 berkeley db(以下简称DB)的设计

4.3基于TTS语音库的设计

 

第5章 硬件连接框图

 

第6章 软件流程

6.1开发环境搭建

6.1.1 构建Kdevelop IDE综合开发环境

6.1.2 构建Qt Designer  GUI开发环境

6.1.3 建立BerKeley DB编译环境

6.1.4 创建TTS智能语音库

6.2建立开发工程

6.3 编译工程

6.4软件设计简要分析

6.4.1界面设计

6.4.2类结构设计  

6.4.3类定义与个别函数介绍     

6.4.4多线程编程方式

6.5关联窗口信号与相应槽   

6.6数据插入表格方法     

6.7清除表格数据分类处理

6.8编码处理

第7章系统测试方案

7.1 基于PC机的设计方案测试

7.2 基于ARM宿机的设计方案测试

第8章测试设备

第9章测试数据

第10章结果分析

10.1 基于PC机的软件结果分析

10.2 基于ARM的软件结果分析

第11章实现功能

第12章特色

第13章 使用指南

参考文献

 

1章 绪论

1.1 目前基于嵌入式设备的信息管理系统现状

目前嵌入式设备上的信息管理软件大部分是基于QT和其插件sqlite来设计的,这样对于数据库的移植不是很方便,而且很繁杂,而berkeley db是一种简洁的与平台无关的嵌入式数据库,只要生成一个数据库,在无需任何依赖库的情况下运行。极大的方便了管理系统的移植,提高了数据处理速度。为QT+berkeley db的设计模式向移动设备移植做出了率先实验。

 

1.2 软件开发背景  

       Berkeley db是一种极其简洁的嵌入式数据库,而且平台无关,稳定性极强,在开发QT的过程中有了用berkeley db + qt来开发一个信息管理软件的想法,在开发过程中发现其应用很好。为了适应现在消费者对移动设备上的语音的要求,再加入了TTS语音。这样,一个完整的创新的信息管理软件就应运而生。

 

2章 系统方案

2.1软件整体设计方案   

§软件开发基础库:

1)                图形库: qtopia

2)                数据库:Berkeley DB

3)                语音库:智能语音 TTS库

§软件开发环境

(1)IDE软件开发环境

◆ Linux+Kdevelop(Qdevelop)+Qtdesigner

◆ windows+Qdevelop+Qtdesigner

(2)文本编辑开发

◆    Linux+Vim(Emacs或记事本)+GCC

◆    windows+ UltraEdit(或记事本)+GCC

§软件运行环境:

  • (1) 系统:Linux/window/嵌入式系统
  • (2) 依赖库:

◆    qtopia图形库。

◆    数据库:Berkeley DB。

◆    语音库:音频I/O处理库,TTS朗读语音库。

 

2.2 搭建主机-宿机开发环境

§串口连接

      PC与arm串口连接,在linux下面用minicom进行终端操作。

§网络连接

      PC与arm用网线连接,用ftp或者nfs进行文件传输或者文件共享。

§输入设备连接

      用ps2或者USB键盘和鼠标连接,实现文字输入与操作。

2.3建立tools Chain交叉编译环境   

可以下载源码自己编译,或者用eldk工具建立完整的开发工具链,也可以直接用我们做好的环境(tools/toolsChain/arm-Linux-gcc-3.4.1.tar.bz2)。

◆ tar jxvf arm-Linux-gcc-3.4.1.tar.bz2

默认解压到/usr/local/arm/3.4.1/bin/

2.4 搭建qtopia交叉编译开发环境   

◆ tar zxvf qtopia-core-opensource-src-4.3.3.tar.gz

◆ cd qtopia-core-opensource-src-4.3.3/mkspecs/qws/Linux-arm-g++

◆ vi qmake.conf

◆ 由于没有设置相应环境变量,故用绝对路径,在arm-Linux- 前面加上路径/usr/local/arm/3.4.1/bin/

◆cd ../../../   回到源代码根目录

◆./configure -embedded arm -xplatform qws/linux-arm-g++ -depths  8,16,32 -no-qt3support

◆ 配置QT/E

① 在文件qtopia-core-opensource-src-4.3.3/src/gui/embedded/qmouselinuxtp_qws.h中加入

    #define QT_QWS_IPAQ

    #define QT_QWS_IPAQ_RAW

    ② 在文件qmouselinuxtp_qws.cpp里把/dev/h3600_ts替换为自己板子的设备文件,我的板子的设备为/dev/h3600_tsraw,正好与qmouselinuxtp_qws.cpp中使用的设备中一致,就不用改了。

注意:

步骤2中如果只定义了#define QT_QWS_IPAQ则使用的是/dev/h3600_ts,如果两个都定义了则使用的是/dev/h3600_tsraw

③ 配置完成后运行gmake进行编译,编译过程中可能会出现无法找到头文件zlib.h问题,则按①,②所述修改相应文件即可。

④  编译完成后运行 make install进行安装, qtopia-core-opensource-src-4.3.3将被安装到/usr/local/Trolltech/QtopiaCore-4.3.3-arm。

◆ 环境测试

①建立NFS共享目录mkdir /mnt/sharelib

②将local/Trolltech/QtopiaCore -4.3.3-arm全部拷到开发板的NFS启动目录或者作一个ln。

③开启pc主机的nfs服务

    Service portmap start

    Service nfs start

④ 挂载

Mount -t nfs -o nolock 10.10.19.27:/mnt/sharelib /usr

注意:

由于我们前面安装是默认路径,所以我们需要把所需要的库都挂载到/usr默认路径下。若出现: Cannot find font definition file /usr/local/Trolltech/QtopiaCore-4.3.3-arm是路径不对,可以按上面方法挂载。

   ⑤在开发板上设置环境变量

#export set HOME=/root

#export set QTDIR=/usr/local/Trolltech/QtopiaCore-4.3.3-arm

#export set QPEDIR=/usr/local/Trolltech/QtopiaCore-4.3.3-arm

#export set QWS_KEYBOARD=”USB:/dev/input/event1″

#export set QWS_MOUSE_PROTO=”LinuxTP:/dev/h3600_tsraw”

#export set PATH=$QPEDIR/bin:$PATH

#export set LD_LIBRARY_PATH=$QTDIR/lib:$QPEDIR/lib       

    ⑥        

#cd /usr/local/Trolltech/QtopiaCore-4.3.3-arm/examples/mainwindows/application

#./application -qws       

如果可以看到显示屏上出现了一个窗口,说明我们的环境已经搭建好了。

  • ⑦ 接下来,我们就要移植我们自己编译的一个 helloword 例子程序。来进一步验证环境是否处理好了。

测试程序:

 

#include <QtGui/QApplication>

#include <QtGui/QWidget>

#include <QtGui/QLabel>

#include <QtCore/QTextCodec>

#include <QFont>

int main(int argc,char *argv[])

{

    QApplication app(argc,argv);

    QTextCodec::setCodecForTr(QTextCodec::codecForName(“UTF-8”));

    QWidget *pWidget=new QWidget;

    QLabel label(pWidget);

    QFont font;

    font.setPointSize(12);

    font.setFamily(“wenquanyi”);

    app.setFont( font );

    label.setText(QObject::tr(“您好”));

    pWidget->show();

    return app.exec();

}

 

注意:程序里面必须设置相应字体与编码,否则中文无法显示。

编译: qmake -project

qmake

make

生成可执行文件,拷贝到NFS共享目录/mnt/sharelib下面,按上面介绍方法挂载NFS目录到开发板/usr目录。执行正确,说明QT的开发环境与运行环境都已经完全配好了。

 

2.5 构建Berkeley db 交叉编译开发环境 

◆ 安装

从DB的官方站点http://www.sleepycat.com/下载最新的软件包db-4.6.18.tar.gz解压到工作目录,进入该目录。

#../dist/configure  CC=/usr/local/arm/3.4.1/bin/arm-linux-gcc AR=/usr/local/arm/3.4.1/bin/arm-linux-ar STRIP=/usr/local/arm/3.4.1/bin/arm-linux-strip –host=arm

#make

#make install

Berkeley db缺省把库和头文件默认安装在目录/usr/local/BerkeleyDB.4.6/下

◆移植和测试

如下测试程序实现对BDB的基本操作测试:

#include <db.h>

#include <stdio.h>

#include <stdlib.h>

#include <pthread.h>

void init_DBT(DBT *key,DBT *data)

{

        memset(key,0,sizeof(DBT));

        memset(data,0,sizeof(DBT));

}

void main(void)

{

        DB *dbp;

        DBT key,data;

        u_int32_t flags;

        int ret;

        char *fruit=”apple”;

        int number=15;

        typedef struct customer

        {

                int c_id;

                char name[10];

                char address[20];

                int age;

        }CUSTOMER;

        CUSTOMER cust;

        int key_cust_c_id=1;

        cust.c_id=1;

        strcpy(cust.name,”peter”);

        strcpy(cust.address,”Chian”);

        cust.age=32;

        ret=db_create(&dbp,NULL,0);

        flags=DB_CREATE;

        ret=dbp->open(dbp,NULL,”single.db”,NULL,DB_BTREE,flags,0);

        init_DBT(&key,&data);

        key.data=fruit;

        key.size=strlen(fruit)+1;

        data.data=&number;

        data.size=sizeof(int);

        ret=dbp->put(dbp,NULL,&key,&data,DB_NOOVERWRITE);

        init_DBT(&key,&data);

        key.data=fruit;

        key.size=strlen(fruit)+1;

        ret=dbp->get(dbp,NULL,&key,&data,0);

        printf(“The number = %d/n”, *(int*)(data.data));

        if(dbp!=NULL)

                dbp->close(dbp,0);

}

编译:

/usr/local/arm/3.4.1/bin/arm-linux-gcc -o dbtest22 dbtest22.c -I/usr/local/BerkeleyDB.4.3/include/ -L/usr/local/BerkeleyDB.4.3/lib/ -ldb -lpthread

最后把生成的dbtest22 移植到ARM板子上去。运行有如下结果:

[/usr]./dbtest22

The number = 15

说明我们的Berkeley DB能够很正确的移植到目标板上去了。

2.6 创建TTS语音库

  • ◆ 交叉编译audio I/O library
  • (1) 下载:portaudio_v18_1.zip
  • (2) Unzip portaudio_v18_1.zip
  • (3) cd portaudio_v18_1
  • (4) ./configure CC=/usr/local/arm/3.4.1/bin/arm-linux-gcc AR=/usr/local/arm/3.4.1/bin/arm-linux-ar STRIP=/usr/local/arm/3.4.1/bin/arm-linux-strip –host=arm
  • (5) make
  • (6) make install

执行完以上操作后,portaudio 的audio I/O library将被安装到/usr/local/lib和/usr/local/include/。

  • ◆ 交叉编译TTS语音库

(1)下载:espeak-1.37-source.zip

       (2)unzip espeak-1.37-source.zip

       (3)cd espeak-1.37-source/src

(4)cp portaudio18.h  portaudio.h.

注意: The “TTS” program uses the PortAudio sound interface library.  There are two

versions, V18 and V19 and their APIs are different.  Our Linux distributions

use V18 .

4)                修改Makefile

指定编译时所需要的库和头文件并指明编译环境:

CXX=/usr/local/arm/3.4.1/bin/arm-linux-g++

LIB_AUDIO=-L/usr/local/lib -lportaudio

(5) make

(6) make install

  • ◆ 移植相应的库和espeak-data到目标板上

从源代码包里可以看出相应文件默认安装路径:

PREFIX=/usr

BINDIR=$(PREFIX)/bin

INCDIR=$(PREFIX)/include/espeak

LIBDIR=$(PREFIX)/lib

DATADIR=$(PREFIX)/share/espeak-data

把/share/espeak-data和生成的语音动态库libespeak.so*以及测试程序espeak 拷贝到NFS共享目录/mnt/sharelib下面,把相应的库和QT的库放在一起,按前面所提到的方法挂载到目标板上的/usr目录。

 

  • ◆ 测试

设置环境变量。执行我们写好的Shell脚本arminit 即可。脚本内容如下:

#!/bin/sh

ln -s /dev/sound/dsp /dev/dsp

export set QTDIR=/usr/local/Trolltech/QtopiaCore-4.3.3-arm

export set QPEDIR=/usr/local/Trolltech/QtopiaCore-4.3.3-arm

export set PATH=$QPEDIR/bin:$PATH

export set LD_LIBRARY_PATH=$QTDIR/lib:$QPEDIR/lib

export set QWS_KEYBOARD=”USB:/dev/input/event1″

export set QWS_MOUSE_PROTO=”LinuxTP:/dev/h3600_tsraw”

export set PA_RECOMMENDED_OUTPUT_DEVICE=”sound:/dev/pa_devs”

 

espeak -v en helloworld

espeak -v zh 你好

中英文发音都很正常。

注意: 程序里设置的默认音频设备是/dev/dsp,所以必须作一个ln。

2.7移植软件依赖库与依赖文件(直接拷贝我们做好的文件解压缩即可)

◆把Qtopia库拷贝到/mnt/sharelib/下,挂载后即为/usr/local/Trolltech/QtopiaCore-4.3.3-arm/lib。

◆把portaudio库与TTS语音库拷贝到/mnt/sharelib/目录下,挂载后即存在于/usr/local/Trolltech/QtopiaCore-4.3.3-arm/lib目录下。

◆移植espeak-data到 /usr/share/espeak-data/目录。

 

 

3章功能与指标

 

3.1 软件主要功能   

◆ 智能语音电话薄管理系统可运行在几乎所有视窗操作系统,包括嵌入式操作系统。

◆    采用了语音合成技术,能够智能播报相关信息。

◆    以qtopia作GUI开发(包括其中的输入法开发)。

◆    以Berkeley db作为数据库。

能够实现对常用联系人的资料管理,主要包括:添加,查询,修改,删除联系人信息等主要功能,操作均可用语音提示,由于时间仓促,语音识别部分还未添加上。

3.2 软件设计主要指标

◆    能够成功运行QT程序界面。

◆    能够对联系人信息做添加,查询,修改,删除等常用操作。

◆    能够语音朗读。

 

4章 实现原理

4.1 基于qtopia的设计   

Qt/Embedded的底层图形引擎基于framebuffer。Framebuffer是在Linux内核架构版本2.2以后推出的标准显示设备驱动接口。采用mmap系统调用,可以将framebuffer的显示缓存映射为可连续访问的一段内存储针。由于目前比较高级的ARM体系的嵌入式CPU中大多集成了LCD控制模块,LCD控制模块一般采用双DMA控制器组成的专用DMA通道。其中一个DMA可以自动从一个数据结构队列中取出并装入新的参数,直到整个队列中的DMA操作都已完成为止。另外一个DMA与画面缓冲区相关,这部分由两个DMA控制器交替执行,并每次都自动按照预定的规则改变参数。虽然使用了双DMA,但这两个DMA控制器的交替使用对于CPU来说是不可见的。CPU所获得的只是由两个DMA组成的一个”通道”而已。

Framebuffer驱动程序的实现分为两个方面:一方面是对LCD及其相关部分的初始化,包括画在缓冲区的创建和对DMA通道的设置;另外一方面是对画面缓冲区的读写,具体到代码为read、write、lseek等系统调用接口。至于将画面缓冲区的内容输出到LCD显示屏上,则由硬件自动完成。对于软件来说是透明的。当对于DMA通道和画面缓冲区设置完成后,DMA开始正常工作,并将缓冲区中的内容不断发送到LCD上。这个过程是基于DMA对于LCD的不断刷新的。基于该特性,framebuffer驱动程序必须将画面缓冲区的存储空间(物理空间)重新映射到一个不加高缓存和写缓存的虚拟地址区间中,这样能才保证应用程序通过mmap将该缓存映射到用户空间后,对于该画面缓存的写操作能够实时的体现在LCD上。

在Qt/Embedded中,Qscreen类为抽象出的底层显示设备基类,其中声明了对于显示设备的基本描述和操作方式,如打开、关闭、获得显示能力、创建GFX操作对象等。另外一个重要的基类是QGfx类。该类抽象出对于显示设备的具体操作接口(图形设备环境),如选择画刷、画线、画矩形、alpha操作等。以上两个基类是Qt/Embedded图形引擎的底层抽象。其中所有具体函数基本都是虚函数,Qt/Embedded对于具体的显示设备,如Linux的framebuffer、Qt Virtual Framebuffer做的抽象接口类全都由此继承并重载基类中的虚函数实现。

对于基本的framebuffer设备,Qt/Embedded用QlinuxFbScreen来处理。针对具体显示硬件(如Mach卡、Voodoo卡)的加速特性,Qt/Embedded从QlinuxFbScreen和图形设备环境模板类QgfxRaster继承出相应子类,并针对相应硬件重载相关虚函数。

Qt/Embedded在体系上为C/S结构,任何一个Qt/Embedded程序都可以作为系统中唯一的一个GUI Server存在。当应用程序首次以系统GUI Server的方式加载时,将建立QWSServer实体。此时调用QWSServer::openDisplay()函数创建窗体,在QWSServer::openDisplay()中对QWSDisplay::Data中的init()加以调用;根据QgfxDriverFactory实体中的定义(QLinuxFbScreen)设置关键的Qscreen指针qt_screen并调用connect()打开显示设备(dev/fb0)。在QWSServer中所有对于显示设备的调用都由qt_screen发起。至此完成了Qt/Embedded中QWSServer的图形发生引擎的创建。当系统中建立好GUI Server后,其它需要运行的Qt/Embedded程序在加载后采用共享内存及有名管道的进程通信方式,以同步访问模式获得对共享资源framebuffer设备的访问权。

4.2基于 berkeley db(以下简称DB)的设计

DB的设计思想是简单、小巧、可靠、高性能。如果说一些主流数据库系统是大而全的话,那么DB就可称为小而精。DB提供了一系列应用程序接口(API),调用本身很简单,应用程序和DB所提供的库在一起编译成为可执行程序。这种方式从两方面极大提高了DB的效率。第一:DB库和应用程序运行在同一个地址空间,没有客户端程序和数据库服务器之间昂贵的网络通讯开销,也没有本地主机进程之间的通讯;第二:不需要对SQL代码解码,对数据的访问直截了当。

DB对需要管理的数据看法很简单,DB数据库包含若干条记录,每一个记录由关键字和数据(KEY/VALUE)构成。数据可以是简单的数据类型,也可以是复杂的数据类型,例如C语言中结构。DB对数据类型不做任何解释, 完全由程序员自行处理,典型的C语言指针的”自由”风格。如果把记录看成一个有n个字段的表,那么第1个字段为表的主键,第2–n个字段对应了其它数据。DB应用程序通常使用多个DB数据库,从某种意义上看,也就是关系数据库中的多个表。DB库非常紧凑,不超过500K,但可以管理大至256T的数据量。

DB的设计充分体现了UNIX的基于工具的哲学,即若干简单工具的组合可以实现强大的功能。DB的每一个基础功能模块都被设计为独立的,也即意味着其使用领域并不局限于DB本身。例如加锁子系统可以用于非DB应用程序的通用操作,内存共享缓冲池子系统可以用于在内存中基于页面的文件缓冲。

 

4.3基于TTS语音库的设计   

We use the opensource software to speech the texts,Speak produces good quality English speech and other Languages speech. It uses a different synthesis method from other open source TTS engines, and sounds quite different. It’s perhaps not as natural or “smooth”, but I find the articulation clearer and easier to listen to for long periods.

A shared library version is also available.

  • Includes different Voices, whose characteristics can be altered.
  • Can produce speech output as a WAV file.
  • SSML (Speech Synthesis Markup Language) is supported (not complete), and also HTML.
  • Compact size. The program and its data, including several languages, totals about 700 kbytes.
  • Can translate text to phoneme codes, so it could be adapted as a front end for another speech synthesis engine.
  • Potential for other languages. Several are included in varying stages of progress. Help from native speakers for these or other languages is welcomed.
  • Development tools available for producing and tuning phoneme data.
  • Written in C++.

It works well as a “Talker” with the KDE text to speech system (KTTS), as an alternative to Festival for example. As such, it can speak text which has been selected into the clipboard, or directly from the Konqueror browser or the Kate editor. A Gnome Speech driver is now available.

 

5章 硬件框图

  • ◆ 系统框图

 

硬件实物图

 

6章 软件流程

开发本软件代码需要:C/C++语言 + linux开发知识 + QT4开发知识 + Berkeley DB基本知识+TTS基本语音朗读知识。

 

6.1开发环境搭建

6.1.1 构建Kdevelop IDE综合开发环境

KDevelop项目诞生于1998年,其最初的目的是为KDE提供一套功能强大的集成开发环境。此后,KDevelop采用GPL进行发布,它支持多种编程语言,如:C/C++,Ada, Java, Pascal, Fortran, PHP, Perl, Shell, Python, Ruby,SQL等。截至作者写本文时,KDevelop的稳定版本为3.5.2,读者可以到以下官方网站下载

http://www.kdevelop.org/index.htmlilename=3.5/download.html

KDevelop的源码安装与rpm包安装比较麻烦,需要事先安装好一系列的依赖软件,值得庆幸的是一般linux操作系统安装时都可以选择安装上kdevelop,则不必自己动手。当然,如果你安装系统时没有安装上kdevelop又不想处理软件包之间的依赖关系,就可以通过yum方式或者apt方式安装过。

6.1.2 构建Qt Designer  GUI开发环境

Qt Designer是一个功能强大的GUI界面开发工具,它是挪威Trolltech公司的Qt图形软件包的一个组成部分。Qt Designer开发的快速应用程序,界面美观、性能优越,且具有优良的跨平台特性,支持几乎所有的平台。Qt Designer可以单独使用,也可以与微软的Visual Studio和Linux下的KDevelop集成在一起使用,具有快速预览界面、自动布局管理、扩展定制控件和自动生成代码等特点。其特有的信号/槽(Signals/Slots)机制可以进行事件处理和对象之间的消息传递,是Qt Designer的一个重要的特性。截至作者写本文档时,Qt的开源版本为4.4.0,读者可以到以下官方网站下载源代码:

http://wftp.tu-chemnitz.de/pub/Qt/qt/source/qt-x11-opensource-src-4.4.0.tar.gz

下载后,通过以下命令进行解压缩和安装:

# cd qt-x11-opensource-src-4.4.0

# ./configure

# make

 

QT默认安装在/usr/local/Trolltech/Qt-4.4.0目录。编译完后,源代码不要删除,在以后需要调试到源代码时还可以使用。

安装可能需要比较长的时间。现在的Linux发行版一般带有Qt Designer,例如笔者的

Fedora 8就自带Qt Designer 3,可以通过yum升级到Qt Designer 4,但是经作者测试yum  qt4会造成系统X11不稳定。推荐用源代码安装。

在Windows下,像Visual C++这样的开发工具已经包括了编辑器、编译器以及调试器等一系列的工具,它们是一个独立的整体。而在Linux下,KDevelop只是一个集成开发

来源:ketiy2004

声明:本站部分文章及图片转载于互联网,内容版权归原作者所有,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2012年1月9日
下一篇 2012年1月10日

相关推荐