如何在CarBidesymbian 3rd版本下调试控制台程序
本人搭建的环境为ActivePerl-5.8.8.822 + jdk1.6.0_04 + Carbide.C++ V1.2 + S60-SDK-200634-3.1(FP1),至今环境没有发现什么大问题,搭建完调试控制台程序时发现问题——程序编译能通过,但是一旦运行(Run)和调试(Debug)就没有任何反应,后来上网查找解决方法:
第一种方法
在X:\Symbian\9.1\S60_3rd_MR\Epoc32\Data下的epoc文件第一行加入textshell语句,保存后再运行simulator就会出现控制台界面。
在控制台界面下敲入:cd private 进入private文件夹,再输入要运行的程序的文件名(例如:engine),用console类输出的语句就会能显示出来。
如果要切换回GUI界面,在textshell前加上#就表示被注释掉了,再次运行simulator就是GUI界面罗:)
注:该方法出现的控制台界面与Dos环境一样,但是本人没有调试运行成功,因为编译之后的路径压根就不在“\Epoc32\winscw”而在“\Epoc32\release\winscw\udeb”从Dos的角度看,这种情况下只有外部将*.Exe文件拷贝过去才可以用,但是拷贝之后类似Dos下执行说是未发现文件。至此该方法被我中断。
第二种方法:
(1)编译控制台(Console)程序程序。控制台(Console)程序例子的路径: D:\Symbian\9.2\S60_3rd_FP1\Examples\Basics\HelloWorld,在cmd命令提示符中进入对应的路径,输入bldmake bldfiles1~2秒后,该命令完成,无任何输出。
输出以下命令进行编译和链接:abld build winscw udeb
编译后生成的exe文件在D:\Symbian\9.2\S60_3rd_FP1\Epoc32\release\winscw\udeb下。
(2)在cmd命令提示符中进入D:\Symbian\9.2\S60_3rd_FP1\Epoc32\release\winscw\udeb,输出以下命令运行对应的程序
HelloWorld.exe
仿真器出现,自动运行这个控制台(Console)程序HelloWorld。
注:该方法是可以执行,但是如果没有像第一种方法那样在“epoc.ini”文件中设置“textshell”那么出现的控制台在1~2秒之后就退出了进入GUI环境,另就算按第一种方法修改了“epoc.ini”文件,程序只有执行功能没有调试功能。
第三种方法:
1、为Console程序添加一个Registration RSS文件。比如: MyConsoleApp_reg.rss,其内容如下:
#include <appinfo.rh>
UID2 KUidAppRegistrationResourceFile
UID3 0xA20001EB // 修改这个,改为与mmp文件相匹配的UID3
RESOURCE APP_REGISTRATION_INFO
{
app_file="MyConsoleApp"; // 修改应用程序名称
embeddability=KAppNotEmbeddable;
}
2、修改mmp文件,添加下述内容:
START RESOURCE MyConsoleApp_reg.rss //该文件名就是上面1修改的注册资源文件
#ifdef WINSCW
TARGETPATH \private\10003a3f\apps //如果只是调试只有这个路径就可以了
#else
TARGETPATH \private\10003a3f\import\apps
#endif
END //RESOURCE
3、编译,运行。
注:该方法既能运行也能调试,而且不用修改“epoc.ini”文件,主要是产生如上效果相对繁琐点。
另外在这里由于有很多别人编辑的程序,可能没有bld.inf文件只有*.mmp文件,这时在Carbide C++ v1.2下导入时,必须自己编写一个bld.inf文件。至于如何编写bld.inf文件,下面给出两篇文档,可以作为基础知识点。
bld.inf、.mmp和.pkg文件浅析
http://blog.csdn.net/btooth/archive/2006/06/24/829333.aspx
时间: 2006-07-30 来自:风生水起
对于每一个项目,都必须有一个工程引导文件bld.inf和一个项目定义文件.mmp。bld.inf文件可能引用一个或多个.mmp文件,每个.mmp文件对应一个将要生成的组件。
一、工程引导文件bld.inf
其实是一个脚本,它告诉build环境在做build之前需要准备或知道一些什么东西,最普通的写法是:
PRJ_MMPFILES
HelloWorld.mmp
这是告诉build环境,你马上要处理的工程文件名字叫HelloWorld.mmp。
如果做比较复杂的程序可能需要同时build所有的库,那么就在这里把你所有需要build的工程都列出来:
PRJ_MMPFILES
Project.mmp
Project_lib1.mmp
Project_lib2.mmp
另外一个常用的标记是PRJ_PLATFORMS。它告诉编译环境,以下的这些平台(Targets)是需要编译的。
PRJ_PLATFORMS
WINS ARMI WINSCW
或者直接使用:
PRJ_PLATFORMS
DEFAULT
注意:如果在bld.inf中不做PRJ_PLATFORMS标记,其效果相当于PRJ_PLATFORMS DEFAULT,也就是说这个标记不是必须的。
第三个常用标记是PRJ_EXPORTS。它告诉编译器在编译之前需要把哪些文件先拷贝到指定位置。举个例子,如果你的工程里面需要include一个第三方的*.inl文件,那么如果编译之前这个文件不存在就会编译不过,那么可以这样写:
PRJ_EXPORTS
.\nk_set.inl \epoc32\include
那么,编译时,一个perl脚本会首先把你工程目录下的nk_set.inl文件拷贝到\epoc32\include目录下,然后再编译。
大多数的bld.inf文家需要这三个标记就够了,还有一点小技巧,就是可以在其中使用#if #else等东西,比如:
#if defined(WINS)
…….//注意没有{ }
else
…….
#endif
二、项目定义文件.mmp
这个文件的内容要比bld.inf文件复杂的多。
先看一下HelloWorldbasic.mmp文件的内容:
TARGET HelloWorldBasic.app
TARGETTYPE app
UID 0x100039CE 0x10005B91
TARGETPATH \system\apps\helloworldbasic
SOURCEPATH ..\src
SOURCE HelloWorldBasic.cpp
SOURCE HelloWorldBasicApplication.cpp
SOURCE HelloWorldBasicAppView.cpp
SOURCE HelloWorldBasicAppUi.cpp
SOURCE HelloWorldBasicDocument.cpp
SOURCEPATH ..\group
RESOURCE HelloWorldBasic.rss
USERINCLUDE ..\inc
SYSTEMINCLUDE \epoc32\include
LIBRARY euser.lib
LIBRARY apparc.lib
LIBRARY cone.lib
LIBRARY eikcore.lib
LIBRARY avkon.lib
.mmp文件以平台无关和编译器无关的方法指定项目组件的属性。
(1)TARGET:应用程序的名称,该名称必须具有正确的文件扩展名:.exe、.app、.dll等
(2)TARGETTYPE:定义为app(该选项确定UID1的值),意味着这是一个GUI应用程序,还存在许多其他类型,包括dll、exe、tsy、csy和ldd。
(3)UID:指定GUI应用程序的唯一系统标志符。
(4)TARGETPATH:最终生成的应用程序及其组件所在的位置,总是位于\system\apps\下面,该目录相对于设备驱动器、模拟驱动盘(例如C:)或模拟ROM(Z:)驱动盘的根目录。
(5)SOURCEPATH:项目源文件的位置路径。
(6)LANG:若应用程序支持不同语言,则使用该语句。每种支持的语句具有两位数字的代码,例如01表示英语,02表示法语,03表示德语。
(7)SOURCE:指定项目源文件的名称。可以多次使用该语句,并且在每条语句上可以有多个文件名。
(8)RESOURCE:指定资源文件。
(9)USERINCLUDE和SYSTEMINCLUDE:指定应用程序特有的头文件的位置。
(10)LIBRARY:列出需要链接的应用程序框架和图形库――这些是对应于共享库DLL的.lib文件,将在运行时调用这些DLL函数。
(11)AIF:指定应用程序信息文件(.aif),该文件包含应用程序资源文件中定义的图标和其他应用程序属性。
针对于项目定义文件,我们看一下其中部分关键词的详细解释:
(1) UID:全球唯一性标志符,由32位二进制数字构成。在symbian os中,通过UID类型标志对象,UID类型具有3个组件UID:UID1、UID2、UID3。
UID1:确定文件是文档还是可执行码,应将它看作一个系统级的标志符,用于区分可执行文件、DLL等文件。.mmp文件中的TARGETTYPE语句确定UID1。
UID2:对于文档文件,UID2确定文档类型(应用程序数据文件或.aif文件)。对于可执行代码文件,UID2确定可执行文件的类型(.app、.dll、.tsy)。对于可执行文件,在.mmp文件中的UID行上指定UID2和UID3。(该UID不是很重要,可以考虑别从的类似文件拷一个过来,也可以随便写一个,目前我还没有因为这个产生过错误,所以不用深究)
UID3:是一个应用程序级的标志符,应用程序的UID3必须不同于其他所有应用程序。只有symbian才可以发布这些值。通过电子邮件到symbian获取,开发实验时,可以使用0x01000000~0x0FFFFFFF,但发布时不能再使用。
Symbian os使用UID将文档(数据文件)和.aif文件与它们各自的应用程序关联起来;UID3包含在每个数据文件、可执行文件或.aif文件的头部。然而,可执行文件和它们的组件仍然需要具有正确的文件扩展名,否则它们将无法正确运行。
当应用程序创建文档文件时,应用程序框架将所有的3个UID和32位的检查总数自动合并到头文件的前16个字节。
(2)AIF文件
在运行时使用.aif文件,并且存储关于应用程序的数据。包括:
a、两种大小的图标
b、各种功能,例如文档嵌入、新文件的建立、是否隐藏应用程序以及MIME类型支持的优先级。
c、可选地使用支持语言的应用程序标题(名称)。
如果没有.aif文件,应用程序将使用默认的图标、以应用程序名称(省略扩展名)作为标题。
图标:
网格和列表视图使用42×29象素的图标,然而状态面板的上下文面板(当应用程序具有焦点时显示在屏幕的顶部)使用44×44的图标。
提供不同的图标大小有助于确保系统可以使用最合适的大小。如果只提供一种大小,那么显示时就会缩放,损坏图标质量。
这种位图文件格式称为多重位图文件格式(.mbm),有相应的工具Aifbuilder来设计这种位图。
AIF文件本地化:
如果应用程序根据不同的语言而提供不同的图标,通过使用扩展名.axx保存产生的每个本地化.aif文件,其中xx是与适当地区关联的两位数字语言码。
标题:
Series60 UI和应用程序框架Avkon提供了将标题和应用程序关联的可选功能――相比于一般通过.aif文件提供标题的功能,应该优先使用这种功能。默认情况下,系统将使用.aif文件中的标题。然而,很可能应用程序创建一个单独的标题文件,同时包含普通长度标题和简短标题――简短标题用于网格视图,普通标题用于列表视图。使用创建普通GUI资源文件的方法得到标题文件。对于HelloWorld项目,标题源文件是HelloWorld_caption.rss,在运行时使用二进制输出文件为HelloWorld_caption.rsc。如果需要,可以为每种语言产生单独的标题文件。
通过将额外的行添加到应用程序的.mmp文件:
RESOURCE:HelloWorld_caption.rss
三、.pkg文件
pkg文件也就是安装包配置文件,是制作Symbian OS安装程序的核心部分。它包含了制作安装文件所需要的全部信息。为了生成.sis文件,必须首先编写.pkg文件。因此制作Symbian程序安装文件的过程,实际上主要就是编写pkg文件的过程。pkg文件像Symbian的资源文件一样,有自己完整的语法体系,掌握了pkg文件的语法,就基本上掌握了制作安装程序的大部分知识,所以熟悉pkg文件的结构,对于制作安装程序来说,是非常重要的。
举例(HelloWorld.pkg):
;
; Installation file for HelloWorld application
;
;Languages
&EN
;
; UID is the app's UID
;
#{"HelloWorld"},(0x0D0A2843),1,0,0
;
;Supports Series 60 v 2.0
;This line indicates that this installation is for the Series 60 platform v2.0
;This line must appear _exactly_ as shown below in the sis file
;If this line is missing or incorrect, the sis file will not be able
;to be installed on Series 60 v2.0 platforms
(0x101F7960), 0, 0, 0, {"Series60ProductID"}
;
; Four files to install
; Symbols set up for the source location are Carbide.c++ specific symbols
"$(EPOCROOT)epoc32\release\$(PLATFORM)\$(TARGET)\HelloWorld.app" -"!:\system\apps\HelloWorld\HelloWorld.app"
"$(EPOCROOT)epoc32\data\z\system\apps\HelloWorld\HelloWorld.rsc" -"!:\system\apps\HelloWorld\HelloWorld.rsc"
"$(EPOCROOT)epoc32\data\z\system\apps\HelloWorld\HelloWorld_caption.rsc" -"!:\system\apps\HelloWorld\HelloWorld_caption.rsc"
"$(EPOCROOT)epoc32\data\z\system\apps\HelloWorld\HelloWorld.aif" -"!:\system\apps\HelloWorld\HelloWorld.aif"
这个pkg文件是完整的,只要把文件目录适当调整一下,就可以可以使用了。
下面对这个文件的各个部分依次做一些解释说明:
以分号开始的行,是注释。这些注释主要是给开发人员看的,生成器会忽略它们。
&EN,表示安装程序使用的语言。EN表示使用美国英语,具体的代码的意义可以在SDK中查到,这里不详细列出。sis文件支持多语言安装,可以在这里进行设置,比如,&EN,FR,IT,表示是多语言的。对于多语言的安装程序,有一些语法和规则与其对应,具体的使用方法请查阅SDK。如果你只是希望可以做出一个安装程序,那么使用&EN就可以,不过需要保证后面出现的字符串部分使用英文字母。
#{"HelloWorld"},(0x0D0A2843),1,0,0。这是标准Symbian SIS文件的头部。所有的pkg都必须包含这行,而且必须在语言设置的后面。其中HelloWorld是程序的名字,在安装过程中,可能会使用。0x0D0A2843,是所开发程序的UID,具体点说就是mmp文件中UID项的后面那个数字。接下来的数字,依次是主版本号,副版本号,和创建号,这些号码用于安装程序的版本控制。
(0x101F7960), 0, 0, 0, {"Series60ProductID"}。这一句说明了这个程序在安装之前需要准备的组件,实际上就是要求必须是Series60的平台。如果还需要其它的组件,也需要在这里说明。0x101F7960,是组件的UID,它其实表示的是S60 2.0的平台,对于S60 2.1的平台,应该是0x101F9115。0,0,0分别是主副版本号和创建号,Series60ProductID则是当需要显示的时候用于向用户显示的说明文字。
最后就是实际操作的语句了。第一个双引号中的是文件的源位置,它指的是编译后的文件在PC中的位置。你可以使用绝对位置,也可以像例子那样使用相对位置。第二个双引号中的是文件在目标机器中的位置。“!:”表示由用户来选择安装在哪个驱动器下面,如果不想由用户指定,可以使用“C:”,表示安装在电话的C驱动下面。这两行语句表示的意思就是将指定位置的文件复制到电话的指定位置中。还有很丰富的语法,请查看S60的SDK。
以上文档讲的是第二版的东西,转移到第三版之后,需要做一些修改,具体如何修改,诺基亚有一篇详尽的文档,文档地址
http://www.forum.nokia.com/info/sw.nokia.com/id/6190aad6-3b3b-4a6a-a53a-221e61c94248/S60_Platform_Porting_from_2nd_to_3rd_Edition_v1_1_en.pdf.html
由于本人英语太差就不多做翻译了。另网上有一篇某研究生翻译的东东,虽然断章取义但是如果E文太差,对照着E文看一下也不错。
另外第三版的UID有点新东西也在这里说明下:
Symbain的程序主要是用UID标识的,在v9.0后UIDs分为两类,Protected和Unprotected。
UID
|
Class
|
Range
|
Purpose
|
Protected Range
|
0
|
0x00000000 - 0x0FFFFFFF
|
Development use only
|
1
|
0x10000000 - 0x1FFFFFFF
|
Legacy UID allocations
|
2
|
0x20000000 - 0x2FFFFFFF
|
V9 protected UID allocations
|
3
|
0x30000000 - 0x3FFFFFFF
|
Reserved
|
4
|
0x40000000 - 0x4FFFFFFF
|
Reserved
|
5
|
0x50000000 - 0x5FFFFFFF
|
Reserved
|
6
|
0x60000000 - 0x6FFFFFFF
|
Reserved
|
7
|
0x70000000 - 0x7FFFFFFF
|
Vendor IDs.
|
Unprotected Range
|
8
|
0x80000000 - 0x8FFFFFFF
|
Reserved
|
9
|
0x90000000 - 0x9FFFFFFF
|
Reserved
|
A
|
0xA0000000 - 0xAFFFFFFF
|
V9 unprotected UID allocations
|
B
|
0xB0000000 - 0xBFFFFFFF
|
Reserved
|
C
|
0xC0000000 - 0xCFFFFFFF
|
Reserved
|
D
|
0xD0000000 - 0xDFFFFFFF
|
Reserved
|
E
|
0xE0000000 - 0xEFFFFFFF
|
Development use only
|
F
|
0xF0000000 - 0xFFFFFFFF
|
Legacy UID compatibility range
|
如果开发一些Symbian的项目,将来要签名的使用Protected UID,程序必须签名才能安装在真机上。Unprotected可以用来做一些测试、教学程序。
每个应用程序都有3个UID。uid1用于表示Symbian OS平台程序的类型:For EXE uid1 = 0x1000007A; For DLL&APP uid1 = 0x10000079;For ECom Plugin 0x10009D8D。UID2一般都去固定值0x100039CE,我也没有弄清楚具体的作用。UID3标识应用程序。SID的取值和UID3一样。VID一般都取默认的0。UID都在程序的MMP中定义。
posted on 2008-03-11 19:57
frank.sunny 阅读(2507)
评论(0) 编辑 收藏 引用 所属分类:
symbian 开发