如何在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 閱讀(2521)
評論(0) 編輯 收藏 引用 所屬分類:
symbian 開發