2010年5月16日 星期日

用 Xcode 編譯程式的幾個基本要點


由於事情很多,沒什麼時間花在 debug 上面,拖了一兩個月,才總算把之前寫的 Energy Converter 修好 (事實上才開 Xcode 不到三次吧...),中間出現一大堆靈異現象,一些最基礎的問題反而在網路上找不到解法。修好 Energy Converter 非常重要,因為那是我第一個用 Xcode 編譯的 GUI 程式,這個起頭若沒有做好,以後不管寫什麼都沒有用,在別人的電腦不能執行的程式根本就是沒有意義的垃圾。

一開始是我的另一台 PPC G4 Mac mini 的 Xcode 有問題,不管是多簡單的程式,怎麼編譯都會失敗;再來就是我用 Intel MacBook 編譯的程式到了別台 Mac 上居然會 crash.. 我很晚才發現這件事,所以我才後知後覺地拖了很久才在 Energy Converter 的主頁上放上 "注意 ! 內有 Bug 尚未修復 !!" 的字樣。這篇文章就是要講一些在打包程式時要注意的瑣事,因為教學的書或網路文章幾乎不會寫這個,大多是把焦點放在程式碼的撰寫或圖形介面的美化,但是這一步失敗,你的作品也是發表不出去。我不清楚 Apple 官方的開發者文件有沒有把這些寫清楚,可是我沒有時間看了,所以依照個人經驗在網路上留個底吧。

先從第一點來好了,我在 mini 上編譯程式從來沒有成功過,每次都出現以下的錯誤訊息 :


看起來是 WebKit 的問題 .... 有趣的是,我看不出我的程式哪裡跟 WebKit 有關,或是這麼說吧,最好是我的功力有辦法寫網路相關的程式啦 ! Xcode 是在玩什麼把戲 ? 網路上完全找不到解法,有人問一樣的,可是沒人回答。我去 PTT 上尋求高手解答,得到的只是把 WebKit.framework 加進去,當然是沒有用,所以現在我 mini 上的 Xcode 完全葛屁了,我已經放棄去修它了,反正 Script Editor 還能用,而且這台老 mini 還有別的用途。

第二點就是軟體包裝的問題,Mac 上的程式比 Win 的程式麻煩的地方在於,Mac 曾經換過 CPU 心臟,也就是 PowerPC -> Intel,而兩者的程式當然不能共用 (先不提 Rosetta 技術),也因此 Apple 提出 "Universal Binary" (簡稱 UB) 的概念,也就是在一個程式內包含兩種 CPU 所需的程式碼,以應付這個過渡時期。但是 Xcode 預設是將程式編譯成該 Mac 上 CPU 的應用程式,而不是 UB 程式,所以要手動修改一下,點選左側 Groups & Files 裡的 Project 選項,然後按下 Info :


選擇第一個選項 "Architectures" 並點選 "Edit" 即可勾選你的程式要支援的 CPU。

第三點是程式內部的任何檔案,比如說圖片檔、音效檔,甚至是圖示檔,都一定要複製到 Resource 類別裡,不然這個程式在別的電腦上都抓不到這些附屬的檔案。一般的圖片檔放到 Resource 裡之後,會被貼到程式的視窗中,或是用程式碼讀取載入,應該是不會有人弄錯 (應該啦),但是圖示檔要貼到哪去呢 ? 答案是在 Target 類別下的程式  *.app 裡,點選它並按下 Info,就可得到下面的示範圖 :


將 Resource 裡的圖示檔拖拉到 Icon File 的欄位裡即可,這樣編譯出來的程式就會直接有自定的圖示。

最後是 ZeroLink 的問題,一般的 GUI 程式都會連接很多不同的 library 或 framework,那些東西很多是作業系統提供的,程式執行時再去抓取所需的資源來用,而 ZeroLink 就是去除這個步驟,把要連結的資源都包在程式裡,理論上執行會比較快。但是相對地,如果少包了什麼東西,就會發生程式不能在其他電腦跑的窘境。之前的 Energy Converter 就是發生這種事情,下面是 crash report 的截圖 :


好像是少了一個圖檔,然後 ZeroLink 的步驟炸掉。所以我才意識到要把圖示檔加進去,可是還是 crash ... 於是我使用一個消極的方法 -- 不要用 ZeroLink 不就好了 ? 在工具列上的 Build 選單裡選擇 Build Result,會看到 "Active Build Configuration",預設是 "Debug",這是有使用 ZeroLink 的編譯型態,要關掉這種討厭的東西,就用下拉式選單選 "Release" 即可 :


於是編譯出來的程式 app 檔不再存在於 Build/Debug 的資料夾裡,而是 Build/Release 裡,兩個 App 檔看起來都一樣,可是 Release 的 App 測試起來就沒問題。我不清楚其他用 Xcode 編譯程式的人是怎麼把軟體打包起來的,這只是我的經驗,經過這段痛苦的過程,也是學到了一些東西,希望這篇文章能給遇到同樣問題的初學者一點幫助。

沒有留言:

張貼留言