如何在CarBidesymbian 3rd版本下調(diào)試控制臺程序
本人搭建的環(huán)境為ActivePerl-5.8.8.822 + jdk1.6.0_04 + Carbide.C++ V1.2 + S60-SDK-200634-3.1(FP1),至今環(huán)境沒有發(fā)現(xiàn)什么大問題,搭建完調(diào)試控制臺程序時發(fā)現(xiàn)問題——程序編譯能通過,但是一旦運行(Run)和調(diào)試(Debug)就沒有任何反應(yīng),后來上網(wǎng)查找解決方法:
第一種方法
在X:\Symbian\9.1\S60_3rd_MR\Epoc32\Data下的epoc文件第一行加入textshell語句,保存后再運行simulator就會出現(xiàn)控制臺界面。
在控制臺界面下敲入:cd private 進(jìn)入private文件夾,再輸入要運行的程序的文件名(例如:engine),用console類輸出的語句就會能顯示出來。
如果要切換回GUI界面,在textshell前加上#就表示被注釋掉了,再次運行simulator就是GUI界面羅:)
注:該方法出現(xiàn)的控制臺界面與Dos環(huán)境一樣,但是本人沒有調(diào)試運行成功,因為編譯之后的路徑壓根就不在“\Epoc32\winscw”而在“\Epoc32\release\winscw\udeb”從Dos的角度看,這種情況下只有外部將*.Exe文件拷貝過去才可以用,但是拷貝之后類似Dos下執(zhí)行說是未發(fā)現(xiàn)文件。至此該方法被我中斷。
第二種方法:
(1)編譯控制臺(Console)程序程序。控制臺(Console)程序例子的路徑: D:\Symbian\9.2\S60_3rd_FP1\Examples\Basics\HelloWorld,在cmd命令提示符中進(jìn)入對應(yīng)的路徑,輸入bldmake bldfiles1~2秒后,該命令完成,無任何輸出。
輸出以下命令進(jìn)行編譯和鏈接:abld build winscw udeb
編譯后生成的exe文件在D:\Symbian\9.2\S60_3rd_FP1\Epoc32\release\winscw\udeb下。
(2)在cmd命令提示符中進(jìn)入D:\Symbian\9.2\S60_3rd_FP1\Epoc32\release\winscw\udeb,輸出以下命令運行對應(yīng)的程序
HelloWorld.exe
仿真器出現(xiàn),自動運行這個控制臺(Console)程序HelloWorld。
注:該方法是可以執(zhí)行,但是如果沒有像第一種方法那樣在“epoc.ini”文件中設(shè)置“textshell”那么出現(xiàn)的控制臺在1~2秒之后就退出了進(jìn)入GUI環(huán)境,另就算按第一種方法修改了“epoc.ini”文件,程序只有執(zhí)行功能沒有調(diào)試功能。
第三種方法:
1、為Console程序添加一個Registration RSS文件。比如: MyConsoleApp_reg.rss,其內(nèi)容如下:
#include <appinfo.rh>
UID2 KUidAppRegistrationResourceFile
UID3 0xA20001EB // 修改這個,改為與mmp文件相匹配的UID3
RESOURCE APP_REGISTRATION_INFO
{
app_file="MyConsoleApp"; // 修改應(yīng)用程序名稱
embeddability=KAppNotEmbeddable;
}
2、修改mmp文件,添加下述內(nèi)容:
START RESOURCE MyConsoleApp_reg.rss //該文件名就是上面1修改的注冊資源文件
#ifdef WINSCW
TARGETPATH \private\10003a3f\apps //如果只是調(diào)試只有這個路徑就可以了
#else
TARGETPATH \private\10003a3f\import\apps
#endif
END //RESOURCE
3、編譯,運行。
注:該方法既能運行也能調(diào)試,而且不用修改“epoc.ini”文件,主要是產(chǎn)生如上效果相對繁瑣點。
另外在這里由于有很多別人編輯的程序,可能沒有bld.inf文件只有*.mmp文件,這時在Carbide C++ v1.2下導(dǎo)入時,必須自己編寫一個bld.inf文件。至于如何編寫bld.inf文件,下面給出兩篇文檔,可以作為基礎(chǔ)知識點。
bld.inf、.mmp和.pkg文件淺析
http://blog.csdn.net/btooth/archive/2006/06/24/829333.aspx
時間: 2006-07-30 來自:風(fēng)生水起
對于每一個項目,都必須有一個工程引導(dǎo)文件bld.inf和一個項目定義文件.mmp。bld.inf文件可能引用一個或多個.mmp文件,每個.mmp文件對應(yīng)一個將要生成的組件。
一、工程引導(dǎo)文件bld.inf
其實是一個腳本,它告訴build環(huán)境在做build之前需要準(zhǔn)備或知道一些什么東西,最普通的寫法是:
PRJ_MMPFILES
HelloWorld.mmp
這是告訴build環(huán)境,你馬上要處理的工程文件名字叫HelloWorld.mmp。
如果做比較復(fù)雜的程序可能需要同時build所有的庫,那么就在這里把你所有需要build的工程都列出來:
PRJ_MMPFILES
Project.mmp
Project_lib1.mmp
Project_lib2.mmp
另外一個常用的標(biāo)記是PRJ_PLATFORMS。它告訴編譯環(huán)境,以下的這些平臺(Targets)是需要編譯的。
PRJ_PLATFORMS
WINS ARMI WINSCW
或者直接使用:
PRJ_PLATFORMS
DEFAULT
注意:如果在bld.inf中不做PRJ_PLATFORMS標(biāo)記,其效果相當(dāng)于PRJ_PLATFORMS DEFAULT,也就是說這個標(biāo)記不是必須的。
第三個常用標(biāo)記是PRJ_EXPORTS。它告訴編譯器在編譯之前需要把哪些文件先拷貝到指定位置。舉個例子,如果你的工程里面需要include一個第三方的*.inl文件,那么如果編譯之前這個文件不存在就會編譯不過,那么可以這樣寫:
PRJ_EXPORTS
.\nk_set.inl \epoc32\include
那么,編譯時,一個perl腳本會首先把你工程目錄下的nk_set.inl文件拷貝到\epoc32\include目錄下,然后再編譯。
大多數(shù)的bld.inf文家需要這三個標(biāo)記就夠了,還有一點小技巧,就是可以在其中使用#if #else等東西,比如:
#if defined(WINS)
…….//注意沒有{ }
else
…….
#endif
二、項目定義文件.mmp
這個文件的內(nèi)容要比bld.inf文件復(fù)雜的多。
先看一下HelloWorldbasic.mmp文件的內(nèi)容:
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文件以平臺無關(guān)和編譯器無關(guān)的方法指定項目組件的屬性。
(1)TARGET:應(yīng)用程序的名稱,該名稱必須具有正確的文件擴(kuò)展名:.exe、.app、.dll等
(2)TARGETTYPE:定義為app(該選項確定UID1的值),意味著這是一個GUI應(yīng)用程序,還存在許多其他類型,包括dll、exe、tsy、csy和ldd。
(3)UID:指定GUI應(yīng)用程序的唯一系統(tǒng)標(biāo)志符。
(4)TARGETPATH:最終生成的應(yīng)用程序及其組件所在的位置,總是位于\system\apps\下面,該目錄相對于設(shè)備驅(qū)動器、模擬驅(qū)動盤(例如C:)或模擬ROM(Z:)驅(qū)動盤的根目錄。
(5)SOURCEPATH:項目源文件的位置路徑。
(6)LANG:若應(yīng)用程序支持不同語言,則使用該語句。每種支持的語句具有兩位數(shù)字的代碼,例如01表示英語,02表示法語,03表示德語。
(7)SOURCE:指定項目源文件的名稱。可以多次使用該語句,并且在每條語句上可以有多個文件名。
(8)RESOURCE:指定資源文件。
(9)USERINCLUDE和SYSTEMINCLUDE:指定應(yīng)用程序特有的頭文件的位置。
(10)LIBRARY:列出需要鏈接的應(yīng)用程序框架和圖形庫――這些是對應(yīng)于共享庫DLL的.lib文件,將在運行時調(diào)用這些DLL函數(shù)。
(11)AIF:指定應(yīng)用程序信息文件(.aif),該文件包含應(yīng)用程序資源文件中定義的圖標(biāo)和其他應(yīng)用程序?qū)傩浴?/span>
針對于項目定義文件,我們看一下其中部分關(guān)鍵詞的詳細(xì)解釋:
(1) UID:全球唯一性標(biāo)志符,由32位二進(jìn)制數(shù)字構(gòu)成。在symbian os中,通過UID類型標(biāo)志對象,UID類型具有3個組件UID:UID1、UID2、UID3。
UID1:確定文件是文檔還是可執(zhí)行碼,應(yīng)將它看作一個系統(tǒng)級的標(biāo)志符,用于區(qū)分可執(zhí)行文件、DLL等文件。.mmp文件中的TARGETTYPE語句確定UID1。
UID2:對于文檔文件,UID2確定文檔類型(應(yīng)用程序數(shù)據(jù)文件或.aif文件)。對于可執(zhí)行代碼文件,UID2確定可執(zhí)行文件的類型(.app、.dll、.tsy)。對于可執(zhí)行文件,在.mmp文件中的UID行上指定UID2和UID3。(該UID不是很重要,可以考慮別從的類似文件拷一個過來,也可以隨便寫一個,目前我還沒有因為這個產(chǎn)生過錯誤,所以不用深究)
UID3:是一個應(yīng)用程序級的標(biāo)志符,應(yīng)用程序的UID3必須不同于其他所有應(yīng)用程序。只有symbian才可以發(fā)布這些值。通過電子郵件到symbian獲取,開發(fā)實驗時,可以使用0x01000000~0x0FFFFFFF,但發(fā)布時不能再使用。
Symbian os使用UID將文檔(數(shù)據(jù)文件)和.aif文件與它們各自的應(yīng)用程序關(guān)聯(lián)起來;UID3包含在每個數(shù)據(jù)文件、可執(zhí)行文件或.aif文件的頭部。然而,可執(zhí)行文件和它們的組件仍然需要具有正確的文件擴(kuò)展名,否則它們將無法正確運行。
當(dāng)應(yīng)用程序創(chuàng)建文檔文件時,應(yīng)用程序框架將所有的3個UID和32位的檢查總數(shù)自動合并到頭文件的前16個字節(jié)。
(2)AIF文件
在運行時使用.aif文件,并且存儲關(guān)于應(yīng)用程序的數(shù)據(jù)。包括:
a、兩種大小的圖標(biāo)
b、各種功能,例如文檔嵌入、新文件的建立、是否隱藏應(yīng)用程序以及MIME類型支持的優(yōu)先級。
c、可選地使用支持語言的應(yīng)用程序標(biāo)題(名稱)。
如果沒有.aif文件,應(yīng)用程序?qū)⑹褂媚J(rèn)的圖標(biāo)、以應(yīng)用程序名稱(省略擴(kuò)展名)作為標(biāo)題。
圖標(biāo):
網(wǎng)格和列表視圖使用42×29象素的圖標(biāo),然而狀態(tài)面板的上下文面板(當(dāng)應(yīng)用程序具有焦點時顯示在屏幕的頂部)使用44×44的圖標(biāo)。
提供不同的圖標(biāo)大小有助于確保系統(tǒng)可以使用最合適的大小。如果只提供一種大小,那么顯示時就會縮放,損壞圖標(biāo)質(zhì)量。
這種位圖文件格式稱為多重位圖文件格式(.mbm),有相應(yīng)的工具Aifbuilder來設(shè)計這種位圖。
AIF文件本地化:
如果應(yīng)用程序根據(jù)不同的語言而提供不同的圖標(biāo),通過使用擴(kuò)展名.axx保存產(chǎn)生的每個本地化.aif文件,其中xx是與適當(dāng)?shù)貐^(qū)關(guān)聯(lián)的兩位數(shù)字語言碼。
標(biāo)題:
Series60 UI和應(yīng)用程序框架Avkon提供了將標(biāo)題和應(yīng)用程序關(guān)聯(lián)的可選功能――相比于一般通過.aif文件提供標(biāo)題的功能,應(yīng)該優(yōu)先使用這種功能。默認(rèn)情況下,系統(tǒng)將使用.aif文件中的標(biāo)題。然而,很可能應(yīng)用程序創(chuàng)建一個單獨的標(biāo)題文件,同時包含普通長度標(biāo)題和簡短標(biāo)題――簡短標(biāo)題用于網(wǎng)格視圖,普通標(biāo)題用于列表視圖。使用創(chuàng)建普通GUI資源文件的方法得到標(biāo)題文件。對于HelloWorld項目,標(biāo)題源文件是HelloWorld_caption.rss,在運行時使用二進(jìn)制輸出文件為HelloWorld_caption.rsc。如果需要,可以為每種語言產(chǎn)生單獨的標(biāo)題文件。
通過將額外的行添加到應(yīng)用程序的.mmp文件:
RESOURCE:HelloWorld_caption.rss
三、.pkg文件
pkg文件也就是安裝包配置文件,是制作Symbian OS安裝程序的核心部分。它包含了制作安裝文件所需要的全部信息。為了生成.sis文件,必須首先編寫.pkg文件。因此制作Symbian程序安裝文件的過程,實際上主要就是編寫pkg文件的過程。pkg文件像Symbian的資源文件一樣,有自己完整的語法體系,掌握了pkg文件的語法,就基本上掌握了制作安裝程序的大部分知識,所以熟悉pkg文件的結(jié)構(gòu),對于制作安裝程序來說,是非常重要的。
舉例(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文件是完整的,只要把文件目錄適當(dāng)調(diào)整一下,就可以可以使用了。
下面對這個文件的各個部分依次做一些解釋說明:
以分號開始的行,是注釋。這些注釋主要是給開發(fā)人員看的,生成器會忽略它們。
&EN,表示安裝程序使用的語言。EN表示使用美國英語,具體的代碼的意義可以在SDK中查到,這里不詳細(xì)列出。sis文件支持多語言安裝,可以在這里進(jìn)行設(shè)置,比如,&EN,FR,IT,表示是多語言的。對于多語言的安裝程序,有一些語法和規(guī)則與其對應(yīng),具體的使用方法請查閱SDK。如果你只是希望可以做出一個安裝程序,那么使用&EN就可以,不過需要保證后面出現(xiàn)的字符串部分使用英文字母。
#{"HelloWorld"},(0x0D0A2843),1,0,0。這是標(biāo)準(zhǔn)Symbian SIS文件的頭部。所有的pkg都必須包含這行,而且必須在語言設(shè)置的后面。其中HelloWorld是程序的名字,在安裝過程中,可能會使用。0x0D0A2843,是所開發(fā)程序的UID,具體點說就是mmp文件中UID項的后面那個數(shù)字。接下來的數(shù)字,依次是主版本號,副版本號,和創(chuàng)建號,這些號碼用于安裝程序的版本控制。
(0x101F7960), 0, 0, 0, {"Series60ProductID"}。這一句說明了這個程序在安裝之前需要準(zhǔn)備的組件,實際上就是要求必須是Series60的平臺。如果還需要其它的組件,也需要在這里說明。0x101F7960,是組件的UID,它其實表示的是S60 2.0的平臺,對于S60 2.1的平臺,應(yīng)該是0x101F9115。0,0,0分別是主副版本號和創(chuàng)建號,Series60ProductID則是當(dāng)需要顯示的時候用于向用戶顯示的說明文字。
最后就是實際操作的語句了。第一個雙引號中的是文件的源位置,它指的是編譯后的文件在PC中的位置。你可以使用絕對位置,也可以像例子那樣使用相對位置。第二個雙引號中的是文件在目標(biāo)機(jī)器中的位置。“!:”表示由用戶來選擇安裝在哪個驅(qū)動器下面,如果不想由用戶指定,可以使用“C:”,表示安裝在電話的C驅(qū)動下面。這兩行語句表示的意思就是將指定位置的文件復(fù)制到電話的指定位置中。還有很豐富的語法,請查看S60的SDK。
以上文檔講的是第二版的東西,轉(zhuǎn)移到第三版之后,需要做一些修改,具體如何修改,諾基亞有一篇詳盡的文檔,文檔地址
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
由于本人英語太差就不多做翻譯了。另網(wǎng)上有一篇某研究生翻譯的東東,雖然斷章取義但是如果E文太差,對照著E文看一下也不錯。
另外第三版的UID有點新東西也在這里說明下:
Symbain的程序主要是用UID標(biāo)識的,在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
|
如果開發(fā)一些Symbian的項目,將來要簽名的使用Protected UID,程序必須簽名才能安裝在真機(jī)上。Unprotected可以用來做一些測試、教學(xué)程序。
每個應(yīng)用程序都有3個UID。uid1用于表示Symbian OS平臺程序的類型:For EXE uid1 = 0x1000007A; For DLL&APP uid1 = 0x10000079;For ECom Plugin 0x10009D8D。UID2一般都去固定值0x100039CE,我也沒有弄清楚具體的作用。UID3標(biāo)識應(yīng)用程序。SID的取值和UID3一樣。VID一般都取默認(rèn)的0。UID都在程序的MMP中定義。
posted on 2008-03-11 19:57
frank.sunny 閱讀(2545)
評論(0) 編輯 收藏 引用 所屬分類:
symbian 開發(fā)