Palm 是麼是 Palm 大家一定知道.現在越來越多的人投入到 Palm 程序開發的行列中來.今天,就讓我們自己也來體會一下如和在 Linux 上開發 Palm 的程序吧. 為什麼是 Linux 原因很簡單,因為 Linux 是免費的.因為 Linux 下的很多工具也都是免費的. 同時, Linux 本身就是一個最好的程序開發平台. 在 Linux 中寫 Palm 程序,除了需要一個可以正常工作的 Linux 環境以外,我們還需要以下的東西: · 1. 我們需要 Palm OS 的 SDK 來開發 Palm 的程序. Palm 的 SDK 可以在 Palm 的網站中免費下載: http://www.palmos.com/dev/ · 2. Palm Emulator - Palm 的仿真器,用來仿真 Palm 執行我們 寫出的 Palm 程序. Palm Emulator 也可以子愛 Palm 的網 站中免費下載: http://www.palmos.com/dev/ · 3. RPC-Tools 如果想在 Linux 中開發 Palm 的程序. 就需要用到 RPC-Tools 了. RPC-Tools 實際上是通過對 the GNU Compiler Collection, Assembler, linker, 跟 symbolic debugger 做 一些必要的修改,好讓我們可以在 Linux 上面用 C/C++ 來開發 Palm 的程序. RPC-Tools 可以在 http://prc-tools.sourceforge.net/ 中免費下載. · 4. gcc-2.95.3 我們需要打造出一個 cross compiler, 按照 RPC-Tools 的建議,這裡我們選擇了下載 gcc-2.95.3: http://www.gnu.org/software/gcc/gcc-2.95/ · 5. GDB - 用來建立 cross debuger (除錯), 同樣的,按照 RPC-Tools 中的建議,我們選擇 gdb-5.0 : FTP://sources.redhat.com/pub/gdb/old-releases/gdb-5.0.tar.bz2 · 6. Binutils - 我們所需要的一些工具,包含了: ld, as, ar, nm, objcopy, objdump, ranlib, size, strings, strip, c++filt, addr2line 和 nlmconv 這裡我們選擇 binutils-2.9.1 ftp://ftp.gnu.org/gnu/binutils/binutils-2.9.1.tar.gz · 7. make-3.77 - 我們選擇 make-3.77 ftp://ftp.gnu.org/pub/gnu/make/make-3.77.tar.gz · 8. PilRC - PilRC 是 Palm 的 resource compiler. 也就是說把 m68k 的可執行程序代碼編譯成 palm 的 .prc 文件. PilRC 可以 在下面的連結中免費取得: http://www.ardiri.com/index.PHP?redir=palm&cat=pilrc&subcat=download 這裡用於測試的系統是 RedHat 7.3 安裝 Palm SDK 首先 tar vxfz sdk50.tar.gz 這時侯會出現一個 palmos-sdk 的 rpm 文件. 用 rpm -ivh 給安裝上去就好. SDK 會被安裝在 /opt/palmdev/sdk-5 中. 我們現在需要做一個 symbolic link, 把 sdk-5 link 到 sdk 上面去. cd /opt/palmdev ln -s sdk-5 sdk 現在我們已經安裝好了 Palm SDK 了. 接下來就該安裝開發所需要的環境了. 安裝 PRC-Tools 以及 cross compile 所需要的工具 收先我們建立一個新的目錄 mkdir /tmp/prc 然後把 prc-tools-2.0.92.tar.gz binutils-2.9.1.tar.bz2 gcc-2.95.3.tar.bz2 gdb-5.0.tar.bz2 make-3.77.tar.gz 都 copy 過去. cp prc-tools-2.0.92.tar.gz /tmp/prc cp binutils-2.9.1.tar.bz2 /tmp/prc cp gcc-2.95.3.tar.bz2 /tmp/prc cp gdb-5.0.tar.bz2 /tmp/prc cp make-3.77.tar.gz /tmp/prc 然後 cd 到 /tmp/prc 目錄下. 執行解壓縮的動作: 收先把所有 .gz 的解壓縮 for i in *.gz; do tar vxfz $i; done 接下來是一些用 bzip2 壓縮的 .bz2 文件 for i in *.bz2; do tar vxfj $i; done prc-tools 為以上的這些程序,有做一些改動,所以我們需要把上面的程序代碼 patch 一下: cat prc-tools-2.0.92/*.palmos.diff patch -p0 現在我們進入 prc-tools-2.0.92 的目錄,首先我們需要做的是把 binutils-2.91, gdb-5.0, gcc-2.95.3 跟 make-3.77 這幾個目錄用 symbolic link 分別 link 到 prc-tools-2.0.92 這個目錄中. cd prc-tools-2.0.92 ln -s ../binutils-2.9.1 binutils ln -s ../gcc-2.95.3 gcc ln -s ../gdb-5.0 gdb ln -s ../make-3.77 make 為了保持我們程序源碼目錄的整潔與完整性,所以我們在編譯的時侯, 單另建立一個目錄 build: cd .. mkdir build 現在我們只要跑 prc-tools-2.0.92 中的那個 configure 就好了 ../prc-tools-2.0.92/configure --target=m68k-palmos --enable-languages=c,c++ 這裡面我們分別傳給 configure 兩個參數, 一個是告訴我們的 target 為 m68k-palmos 另一個是 enable C/C++ 這兩種語言. prc-tools 中的這只 configure script 會幫我們把 binutils, gcc, gdb, make 這四個程序所需要的 Makefile 也同時幫我們建立好. 現在在我們的 build 目錄中,就有了以下這些東西: binutils config.log crt gcc include libm Makefile config.cache config.status doc gdb libc make tools 現在我們只要用 make all-install 就好了. (如果您不是用 root 帳號, 不要忘記 su 成 root) make all-install 因為需要 compile 的時間滿長的.如果您的系統中有超過一顆的 CPU 記得在 make 後面加上 -j number 的選項,其中 number 的 value 就是您 CPU 的數量加一. 例如您有兩顆 CPU 就可以用 make -j3 all-install, 如果有三顆就用 make -j4 all-install. 如果您的機器又很大的 RAM (好幾 GB)然後也有個十幾顆的 CPU, 那麼也可以用 make -j all-install 來編譯.如果 -j 後面沒有跟任何數字,那麼 make 就不會對 jobs 做任何的限制. 詳細的情況請自行 man make 看一下. 在我們編譯的過程中,還有己個小小的問題需要解決一下(至少這個問題存在於 RedHat 版本的系統中)首先遇到的問題是, 在 gdb 的編譯中有一個錯誤: In file included from /usr/include/curses.h:111, from ../../../prc-tools-2.0.92/gdb/gdb/utils.c:28: /usr/lib/gcc-lib/i386-redhat-linux/2.96/include/stdbool.h:39: conflicting types for `false' ../bfd/bfd.h:101: previous declaration of `false' /usr/lib/gcc-lib/i386-redhat-linux/2.96/include/stdbool.h:41: conflicting types for `true' ../bfd/bfd.h:101: previous declaration of `true' 我們這裡看到在 gdb/gdb.utils.c 中的第 28 行有 include curses.h 這個文件.而 curses.h 中的第 111 行又 include 了 stdbool.h, stdbool.h 中定義了 false, 而 bfd/bfd.h 中同時也定義了 false, 這樣兩個 false 就沖突了.所以造成編譯失敗.這裡用最簡單也是最偷懶的作法,打開 /usr/lib/gcc-lib/i386-redhat-linux/2.96/include/stdbool.h 把: typedef enum { false = 0, true = 1 } _Bool; 這己行給暫時 mark 起來 /* typedef enum { false = 0, true = 1 } _Bool; */ 然後再重新 make all-install 現在我們會遇到第二個問題: gcc -DEXEC_PREFIX=\"/usr/local\" -I. -I../../prc-tools-2.0.92/tools/../binutils/include -I../binutils/bfd -g -O2 -o def.yy.o -c def.yy.c ../../prc-tools-2.0.92/tools/def.l:35:19: utils.h: 沒有此一檔案或目錄 ../../prc-tools-2.0.92/tools/def.l:37:23: pfdheader.h: 沒有此一檔案或目錄 找不到 utils.h 跟 pfdheader.h 這個很容易解決,把 prc-tools-2.0.92/tools 下面這兩個文件復制到 build/tools 下面就好了,這裡我們把全部的東西都給復制過去, 不然等會還會繼續說找不到 utils.h 的文件 cp ../prc-tools-2.0.92/tools/* tools/ 然後繼續 make all-install 接下來又會有一個錯誤中斷編譯: gcc -DEXEC_PREFIX=\"/usr/local\" -I. -I../../prc-tools-2.0.92/tools/../binutils/include -I../binutils/bfd -g -O2 -o def.yy.o -c def.yy.c ../../prc-tools-2.0.92/tools/def.l:39: conflicting types for `dup' /usr/include/unistd.h:441: previous declaration of `dup' 這裡是說,在 def.l 中第 39 行定義的 dup 已經在 /usr/include/unistd.h 中的第 441 行定義過了.所以產生了沖突. 還是用最簡單的方法來解決: 首先要做的是 vim tools/def.yy.c 把第十二行的 #include 改成 #include "unistd.h" 這樣編譯 def.yy.c 的時侯,就不會去找 /usr/include/unistd.h 這個文件,而是找 tools 下面的 unistd.h 接下來 cp /usr/include/unistd.h tools/ 把 unistd.h 復制到 tools 下面,再把 unistd.h 改動一下 最後 vim tools/unistd.h 把第 441 行的 extern int dup (int __fd) __THROW; 給 mark 起來 // extern int dup (int __fd) __THROW; 存盤後重新 make all-install 就再沒有問題了. 這時侯,在您的 /usr/local/bin 下面就已經有了我們做 cross compile 所需要的全部工具了. PS. 不要忘記把了把 /usr/lib/gcc-lib/i386-redhat-linux/2.96/include/stdbool.h 改回原貌喔. 安裝 pilrc 現在到了最後一步,安裝 pilrc 首先把 pilrc-2.9.tar.gz 復制到 /tmp 中 cp pilrc-2.9.tar.gz /tmp 然後解壓縮: