赛迪网

新用户注册

赛迪社区

帮助

  资讯中心 | 技术天地 | 软件特供 | IT财经 | 市场专家 | 互动学校 | DIY专区 | 媒体全文 | IT罗盘 | IT人才




高级检索 媒体速查

发表看法

查看讨论

发给朋友

打印


KDE项目开发人员技术问题解答
(文:David Faure 廖铮编译 2001年07月16日 18:11)

Q:我该如何着手编写一个新的应用程序?

最简单的办法是使用kdesdk/kapptemplate或者kdevelop产生Makefile.am文件。或者,你可以从其他应用程序那里拷贝一份Makefile.am并把它安装在已有KDE源代码的新顶级目录下。第三,你还可以用以前开发软件的老办法,但你这样一来就没有用到autoconf/automake框架的强大开发功能了。

Q:什么是dcop、kpart、kio、kdesktop、kdeinit……

请查看developer.kde.org,特别是结构文挡。另外还可以查看kde书籍。

Q:我真的需要使用dcop和kpart吗?

当然,你不必一定要使用它们,不过用了会好得多。KPart可以实现强大的代码重用。Dcop具有脚本能力,功能强大。这些技术用起来既简单,部署的范围又广,如果你会用却不使用那可真丢人的。

Q:Makefile是如何产生的?

请参看autoconfautomake手册了解其内容。KDE软件构建系统(build system)通过一种名叫am_edit(你可以在admin目录下找到)的程序对此进行了改进和提升。基本上,automake把Makefile.am转变为Makefile.in文件,然后am_edit运行并用KDE特有标签的真实含义取代Makefile.in文件中所有的KDE特有标签,configure会根据Makefile.in文件创建一个Makefile文件。
am_edit所处理的KDE特有标签的说明:

Moc文件
如果你所有的.cpp/.cc文件中都包括其.moc文件(这是快速编译下的建议方式),或者,如果你正在编译单一的二进制文件/库,那么只要使用METASOURCES=AUTO即可。万一在同一目录下有多个二进制文件/库,那么你可能需要如下所示来使用该命令:
libsomething_la_METASOURCES = myfile.moc myotherfile.moc mybinary_METASOURCES = someotherfile.moc

QT Designer文件
myprogram_SOURCES 后面增加.ui文件即可

QT Designer文件
myprogram_SOURCES 后面增加.ui文件即可

DCOP stub和skel
myprogram_SOURCES里增加将生成的.skel和.stub文件即可

图标
KDE_ICON = AUTO 把图标安装到全局KDE目录,而appicondir = $(kde_datadir)/myapp/icons appicon_ICON = AUTO 则把图标安装到“myapp”指定目录(建议在只有某一个程序需要该图标的情况下这么作,这样可以避免弄乱全局目录,同时还避免了发生和代码名称的冲突)。
为了运行 AUTO (以及为了让图标正常装载),你需要采用以下的命名规范:<depth><size>-<type>-<name>.png。
其中:depth取值hi或者lo,也就是指hicolor或者locolor(实际图标风格的名称),size是16、22或者32。type的取值是,应用程序图标是'app'、mimetype图标是'mime'、菜单、工具条按钮是 'action'、某些文件系统(目录等)图标是 'filesys'、光驱/软驱/硬盘等图标是'device'。
你可以在图标选择对话框内找到同样的图标类型。
注意这一规范只对源代码有效。安装的时候,图标会被拷贝到正确的目录,并被简单命名为<name>.png。

文档
KDE_LANG = en (文档采用的语言)
KDE_DOCS = AUTO (如果目录就是应用程序的名字)
KDE_DOCS = myapp 使用特定的应用程序名称

翻译
为了让你的应用程序可译,你必须用i18n()把代码中出现在用户面前的英语字符串扩起来 。你还要在你的顶级Makefile.am中定义一个消息目标。脚本会调用所有的消息目标来创建kde-i18n模块中的pot文件。然后,翻译器就可以创建包含这些翻译消息的.po文件。
现在让我们回到消息目标(messages target)。它应当对包含i18n的源代码调用XGETTEXT——这不等于_SOURCES参数下的调用,因为_SOURCES包含了.ui和.skel文件,这两种文件不能同xgettext一起工作。这就是为什么你通常使用*.cpp、*.h,而不是以上文件的原因(如果可能,请保证包含了子目录)。所以,简单情况下,消息目标看起来如下所示:
messages:
$(XGETTEXT) *.cpp *.h -o $(podir)/mypotfile.pot
mypotfile是你的主KInstance的名字(对应用程序来说,这就是传递给KAboutData的第一个参数,对组件来说,比如part和插件,这就是你创建的KInstance的名字)。
如果你有.ui(Qt designer)或者.rc(XML-UI)文件,使用 messages: rc.cpp脚本即会用当前目录内的ui和rc文件创建rc.cpp。如果你在子目录下有.ui或者.rc文件,那么,在XGETTEXT调用之前,你需要向消息目标中增加$(EXTRACTRC) */*.rc >> rc.cpp这一指令。
还有一个特殊情况是“tip”文件,这是一种XML文件,其中包含了显示给用户的提示。在这种情况下应该使用以下命令:
messages:
perl ./preparetips > tips.cc
$(XGETTEXT) *.cpp *.h tips.cc -o $(podir)/mypotfile.pot
rm -f tips.cc
比如,你可以在kdebase/ktip下找到以上这种脚本(显然,临时tips.cc文件到底用什么名字并不重要)。
最后的问题是编译和安装.po文件。在kde-i18n以内,Makefile.ams文件包含了KDE_LANG=language 和POFILES=AUTO两个指令,意思是目录下所有的.po文件都安装了该语言。
如果你提交了独立的应用程序,而且你想让该程序安装自己的po文件,那么你通常会有一个po/子目录,该目录内的Makefile.am的文件会认定 POFILES=AUTO。在这种情况下,.po文件在拷贝的时候会根据自己的名字,比如$(PACKAGE).mo而得以建立(比如,de.po安装到de/LC_MESSAGES/$(PACKAGE).mo下面,而fr.po 则安装到fr/LC_MESSAGES/$(PACKAGE).mo下面)。

Qt-only程序
默认情况下,am_edit需要kdecore产生“meta-unload”中间文件。为了在建立Qt-only程序时禁用它,请使用KDE_OPTIONS = qtonly。

Q:make参数有哪些?

all:默认参数(当键入“make”时)。
clean:删除所有生成的文件。
distclean:还删除Makefile.cvs产生的文件,在KDE内不太有用(参看“dist”概念下的dist和cvs-clean以了解更好的清除文件方式)。
dist:通常用CVS源代码生成tarball,但在KDE内没有受到良好的支持。最好使用kdesdk/scripts/cvs2pack完成同样的功能。
cvs-clean:(只用于CVS用户)删除不在CVS中的任何文件(警告,如果你还没有提交变更就不要使用它!)。
force-reedit:重新运行Makefile.am中的automake和am_edit。
install:很好,安装所有的东西。
install-exec:只安装二进制文件和库。
install-data:只安装数据文件。
check:编译测试程序(比如,由check_PROGRAMS定义的文件)。在“make check”期间实际运行某些测试是正确而且有益的,请参看kdelibs/arts/tests/Makefile.am。

Q:我检查了cvs,没有configure和Makefile?

使用make -f Makefile.cvs,该命令会运行所有产生Makefile的步骤。

Q:不同的编译选项有哪些?

--enable-debug:增加调试符号,禁用程序优化、打开kdDebug()记录(log)。
--disable-debug:上一参数的反面:启用程序优化并关闭kdDebug()记录。
--enable-final:把所有的.cpp文件连接为一个大型的.all_cpp.cpp文件,然后编译该文件(而不是编译其中的各个.cpp文件)。这会让整个编译过程变得更快,通常会产生更好的优化代码,但也需要更多的内存。不过,当不同源代码文件所包含的.h文件相互冲突时经常会出现编译错误,或者,当使用的不同源文件内具有同一名字的静态函数时也会出现编译错误。这样做在节省软件打包时间上占了便宜,但是对开发者而言并不是这样,因为某个文件中的一个改动就意味着编译全部软件包。
--disable-fast-perl:默认情况下,KDE使用perl而不是sh和sed把Makefile.in转变为Makefile。这是Michael Matz对autoconf的补充。你可以使用该选项禁用它,但编译速度就变慢了。

Q:你建议我应该采用什么编译选项?

如果你是一名开发人员,你应该明确地在--enable-debug参数下编译Qt和KDE。这样,你以后甚至可以在Qt和KDE函数内部调试自己的程序。<br>如果你仅仅是个用户,你也可以使用 --enable-debug。不过,KDE在你的硬盘上会占据更大的空间但不会减慢桌面电脑的运行速度。优点是:当应用程序崩溃的时候你可以得到堆栈的运行记录。如果你执行程序总是崩溃,那么你不妨去bugs.kde.org站点查看你的bug是否已经存在,否则你就可以提交这一个bug,这样对改进kde大有裨益。

对Qt来说,该编译选项在qt-copy/README.qt-copy中解释。

Q:增加编译速度的窍门何在?

请参看以上的 --enable-final 参数。“make final”把当前目录下的文件当作一个文件来用,即便没有采用 --enable-final也是这样。“make no-final”则执行当前目录下的正常编译(即便采用了--enable-final)。 请包含你的moc文件!顺便提一句:kdesdk/scripts/includemocs会自动地完成该功能。请购买更多的内存,更快的计算机和另一个处理器。在一部装备两个PIII 866 MHzCPU、带1G内存的计算机上,编译kde的速度飞快!还有,就是不要使用gcc-2.96。:)

Q:我应该采用什么缩排格式?

如果你在编写已有的应用程序,请尊重作者的缩排格式。否则,你想怎么用就怎么用。

Q:QSpinNumber的bug是怎么回事?

QSpinNumber中有个bug,这个bug还没有的得到纠正。你可以采用KSpinNumber,它几乎具有和QSpinNumber同样的特性。

Q:我编译的时候系统显示“virtual tables error”?

这通常是因为moc文件没有和源文件同步,或者完全没有链接。请检查你是否在运行正确的moc。“which moc”命令可以找出结果。请重新生成你的moc文件(make force-reedit;make clean;make)。
Q:使用dcop的时候,我在myClassHeader.h 文件中增加了k_dcop,但看起来好象什么特别的事情也没有发生?

把myClassHeader.kidl加到Makefile.am中,然后再次运行make。

Q:某些Makefile.am中有一个.stub文件,这是干嘛使的?

Stub没有很好的文档化。stub可以让你把dcop注册应用程序当作其方法就是自己dcop slot的对象。通常,应用程序都有一个appnameIface.h文件,其中包含了所有的dcop slot。你可以在Makefile.am中增加一个appnameIface.stub并使用目标appnameIface。请参看使用konqueror stub的kdebase/khelpcenter示例。

Q:我在myClassHeader.h文件中增加了Q_OBJECT,但是没有产生moc文件?

你需要am_edit重新解析你的Makefile.am来产生正确的Makefile。如果它是你在该目录下所使用的第一个Q_OBJECT,那么你需要在kdesdk/scripts下重新运行Makefile.cvs 或者create_makefile。否则你只要运行“make force-reedit”即可。

Q:为了让程序跑的更快点,我把自己全部类都放到了一个cpp文件里,我该如何得到生成的moc和kidl文件呢?

如果某些类使用了Q_OBJECT宏,那你最好别那样作。KDE框架(am_edit)对这种做法的支持不是很好。METASOURCES=file.cpp可能还更有用些。

Q:我开发了一个kpart(或者插件)。但我不没有root权限,所以我不能安装它。我该如何让kde知道它呢?

使用其它前缀(比如$HOME/kdeprefix)配置和安装你的应用程序并且让KDE知道这一前缀: 或者,你可以设置KDEDIRS为$HOME/kdeprefix:$KDEDIR达到以上目的。为了让KDE知道新的前缀,你还可以编辑/etc/kderc并增加:

[Directories]
prefixes=/the/new/prefix

但这样做还不能解决该问题,你还要在设置了新的KDEDIRS之后运行“kbuildsycoca”。

Q:当我向KTradher请求我的kpart库的时候,它没有被列出来。

当你安装新的服务(比如应用程序或者part)的时候必须重新建立mimetype数据库。理论上说,这个过程应该是自发的(kded会察看这些目录),如果要自己动手,请运行“kbuildsycoca”。

Q:启动另一程序的最佳方式是什么?

kde2迁移指南中有个好法子。请察看kdelibs/KDE2PORTING.html。

(责任编辑 吴北 jiaoxq@staff.ccidnet.com

相 关 文 章

KDE项目开发人员基本问题解答 (2001-07-16 17:33)
您想成为KDE项目开发员吗? (2001-07-13 12:56)
VC开发应用程序答疑 (2001-01-09 19:16)
VB开发应用程序答疑 (2000-12-20 19:36)