2010/06/08

Objective-C on Windows

更新:Apple加入很多Objective-C的新功能與特色,但只有"Apple修改過的gcc"與"clang(llvm)"能夠提供,所以,本篇介紹的GNUstep的gcc,其Objective-C的部份已經太舊,沒辦法編譯新的Objective-C。我另外寫了一篇「在Windows上寫Objective-C程式(使用GNUstep與Clang、LLVM) 」,在GNUstep之上,再安裝clang與llvm。


這篇要介紹的是,如何在Windows XP平台上寫一支Objective-C的hello world!程式。

問:想開發Mac或iPhone或iPad的軟體,該怎麼辦?
答:使用Apple官方的軟體開發工具Xcode,只要到Apple公司的開發者網站,註冊一下(免費),即可下載最新版的Xcode。Xcode只能在Mac OS X(作業系統)上運行,所以要買一台Mac機器(硬體)。

問:哇,這麼多種漂亮的Mac,應該買哪一台啊?
答:有錢的話就買最貴的那一台*_*。


問:什麼是Xcode?
答:Xcode是Apple公司官方的軟體開發工具組,可開發在Mac、iPhone、iPad的軟體,是一個總稱,裡面包含很多東西,有整合式開發編輯器(IDE,也叫做Xcode)、視覺化使用者介面開發工具(Interface Builder)、compiler、linker、debugger(gcc、gdb、llvm...)等等、還有iPhone的模擬器,以及各種framework(函式庫、類別庫、API)。

這是Xcode IDE,負責管理專案檔案、編輯、以及各種設定,從這裡進行編譯除錯執行。


這是Interface Builder,視覺化使用者介面設計,使用拖拉放的方式來操作。(Xcode 4已經整合Interface Builder)


這是iPhone simulator,不用買一支iPhone也可以進行開發iPhone軟體喔。


也就是說,如果你有一台mac(花錢買),下載Xcode(免費下載)後,就可以開始開發,在模擬器上執行看到成果,但是,如果想在iPhone實機上執行你寫的程式的話,那就要加入Apple的iOS Developer Program(要錢,一年要付$99),至於加入、付錢、設定、下載軟體到手機上的過程,本篇不介紹。

問:想先學學Objective-C程式語言,還不想砸錢買Mac,有辦法在Windows上寫Objective-C程式嗎?
答:有,就是這篇的重點了。

問:聽說gcc可以編譯Objective-C,所以在Windows上裝cygwin,裡面有gcc,就可以寫Objective-C程式了?
答:cygwin的gcc的確可以編譯Objective-C程式,但光裝cygwin並不會有任何的物件類別庫(library、class library、framework),所以也就沒有各種基本的物件類別可以用,沒有NSLog可以呼叫(想像成c的printf);沒有NSObject可以繼承,讓你沒辦法立即開始寫自己的物件;沒有Foundation.h(想像成c的stdio.h)連preprocessor都過不去,更別提compiler了。所以只有compiler是不夠的。

問:所以除了compiler還需要?
答:一套framework,裡面會有基本的物件類別。如果是裝Xcode就會有Cocoa for Mac、Cocoa Touch for iPhone。Cocoa大致上分為Foundation跟AppKit兩個部分,AppKit是GUI元件與較高階的元件,而Foundation就是一堆基本的物件類別,例如NSObject、NSString、NSArray、NSNumber等等;而Cocoa Touch分成Foundation跟UIKit,差不多的意思。

問:聽說Cocotron...?
答:Cocotron也是一個Objective-C的開發環境,其目標是讓開發出來的軟體可以在各種平台上執行,例如Windows,但其本身還是要搭配Xcode使用,所以不符本篇主題。

問:那所以咧?
答:使用GNUstep,可在unix-like與Windows上使用,有Cocoa API,也有一些開發工具(類似Xcode提供的工具)可以用,但本篇重點是在Windows上寫一支Objective-C的hello world!程式,所以會用命令列模式shell,只會使用compiler的部份(也是gcc),以及鏈結Cocoa API中Foundation的部份,也就是說不理會AppKit的部分,也不會介紹GNUstep提供的開發工具(Gorm, ProjectCenter...)。

問:GNUstep可在哪些版本的Windows上跑?
答:官方網站上說在WinXP與Win2K測試過,我的電腦是Windows XP。

問:怎麼安裝GNUStep?
答:到GNUstep網站的Windows下載區,下載下面三個安裝套件。
1. GNUstep MSYS System, 41MB. 基本環境與命令列shell。
2. GNUstep Core, 7.6MB. 函式庫、類別庫。
3. GNUstep Devel, 30MB. 開發工具,gcc、make、gdb等等。

注意:請按照順序安裝。
把三個都安裝在同一個目錄,安裝時也都是按Next即可。安裝後執行程式集-GNUstep-shell,會出現一個命令列畫面,恭喜你,已經成功了一半。



問:接下來,怎麼編譯執行一支hello, world!程式呢?
答:用你喜歡的編輯器寫程式,大致內容如下:

把檔案命名為hello.m,.m是Objective-C程式檔案的附檔名,放到家目錄下,大概在C:\GNUstep\home\username,自己找找,然後在shell下執行gcc hello.m,本以為沒啥問題,哪知道出現了一堆錯誤訊息,哇靠。

別急,一個一個來。
首先是error: Foundation/Foundation.h: No such file or directory,找不到Foundation.h ?
因為gcc找不到該.h檔,加入參數-I /GNUstep/System/Library/Headers即可解決。

然後仍然會出現error: cannot find interface declaration for 'NXConstantString',原因是constant string例如@"hello, world!",以前是用NXConstantString,後來改成NSConstantString,所以加入參數-fconstant-string-class=NSConstantString來修正。

到此compile部分已經沒問題了,如果你加上-c參數就可以成功編譯出.o檔。

但是不加-c的話,compile結束後自動帶進的link階段會出現錯誤,訊息會說找不到objc_get_class、objc_msg_lookup、NSLog、__objc_exec_class、__objc_class_name_NSAutoreleasePool、__objc_class_name_NSConstantString。

加入參數-L /GNUstep/System/Library/Libraries -lobjc -lgnustep-base來告知去哪找函式類別庫做link以及該link哪些東西。-L是指定去哪找,-lobjc是Objective-C的核心執行時期函式庫,-lgnustep-base就是Foundation的部份。

注意:下指令時要把hello.m放在-lobjc -lgnustep-base的面。

雖然還是會有linker warning,但a.exe執行檔已經成功產生出來了,執行的話就會看到hello, world!囉。

如果你不想看到warning,加入-Xlinker --enable-auto-import。

最後完整的指令是:
gcc hello.m -I /GNUstep/System/Library/Headers -fconstant-string-class=NSConstantString -L /GNUstep/System/Library/Libraries -lobjc -lgnustep-base -Xlinker --enable-auto-import



問:打這麼長的指令好麻煩?
答:可以用make,或是寫一支小小的shell script。本篇不介紹:D。

問:學習Objective-C與iOS的資源?
答:請看另一篇

2 comments:

  1. Anonymous12/6/12 20:55

    我找不到家目錄.....
    可否告知, 謝謝!

    ReplyDelete
  2. 在你安裝GNUStep的目錄的底下,可能是C:\GNUstep\home\username。

    另外,這篇內容比較舊,有新的在http://yehnan.blogspot.tw/2012/03/windowsobjective-cgnustepclangllvm.html。

    ReplyDelete