前言
如果要在 macOS 上學 Objective-C,大部分的程式人都會使用 Xcode,這是正規的方式;不過,如果有跨平台的選擇,GNUstep 是一個替代的方案。本文兩者皆會介紹。
正規的方法,使用 Xcode
學 Objective-C 最正統的方法是在 Mac 平台上透過 Xcode 來撰寫 Objective-C 程式,至於本系列文章介紹的其他工具或平台,都算是替代性的方法。Xcode 包括
- 編譯器 (C、C++、Objective-C、Swift 等)
- Cocoa 框架 (framework)
- IDE
- iOS 模擬器 (simulator)
如果只要寫 C 或 C++ 程式,命令列工具的部分可獨立安裝,其他的部分則要安裝整個 Xcode。
接下來,我們展示一下用 Xcode 建立新 Objective-C 專案的流程。一開啟 Xcode 時會進入歡迎畫面:
接著選擇專案類型:
一開始我們的目標是練習語法,還用不到 UI 的部分,選擇 Command Line Tool 即可。
接著,選擇專案相關的選項:
一開始預設的語言 (language) 是 Swift,但我們的目標是練習 Objective-C,所以要更改語言。Organization Identifier 的部分一般是用自己所在的開發團隊所擁有的網域的反向來命名,由於我們只是要練語法,用 com.example 也無妨。
再來要選擇專案所在的位置:
最後會進入 Xcode 的編輯器畫面:
這時候就可以開始用 Xcode 來寫程式。
使用其他的編輯器或 IDE
即使使用其他的編輯器或 IDE,仍然要安裝 Xcode,因為 Cocoa 和 Xcode 是包在一起的。只是 Xcode 比較肥大,我們有時候會想用其他的工具。
AppCode 是 JetBrains 所出品的 Objective-C 和 Swift 商業 IDE,有著不錯的評價,提供 30 天的試用期。EditRocket 則是一個多程式語言商業編輯器,包括 Objective-C 在內,同樣提供 30 天試用期;但 EditRocket 沒那麼知名,有興趣的讀者可自行試用。另外,Atom 和 VSCode 皆對 Objecitve-C 提供語法高亮 (synatx highlighting) 等基本的支援。
Hello World 程式
Hello World 程式是用來確認開發環境可正常運作的微型程式,本節建立一個 Objective-C 的版本。開啟編輯器或 IDE,撰寫以下的程式:
#import <Foundation/Foundation.h>
int main(int argc, const char *argv[])
{
@autoreleasepool {
NSLog(@"Hello World");
}
return 0;
}
如果讀者有按照我們先前建立專案的流程的話,可以利用 IDE 的「Build」或「Run」按鈕就可以編譯程式。
如果使用編輯器的讀者,可在終端機輸入以下指令:
$ clang -o hello hello.m -framework Foundation
-framework
參數會同時呼叫相對應的頭文字檔和二進位檔,這是 Mac 上的 Clang 特有的參數。
如何在 macOS 上使用 GNUstep
目前 macOS 無法編譯及安裝 GNUstep 函式庫,主要的原因是 ABI 不相容,至少筆者試了幾個不同的編譯器 (GCC 和 Clang) 和編譯參數皆如此。不過,還是可以搭配 GNUstep Make 的部分來編譯 GNUstep 專案。
筆者其實不是很鼓勵這樣做,因為 Cocoa 和 GNUstep 雖然語言 (Objective-C) 相同,API 部分相容,但 ABI 其實不相容,變成要處理異質的編譯環境所帶來的問題。如果仍然想用 GNUstep 的話,Homebrew 有 gnustep-make 的套件,使用以下指令安裝:
$ brew install gnustep-make
GNUstep Make 是一個以 Makefile 為基礎的小型框架,用來簡化編譯 Objective-C 程式的工作。我們在後文會介紹如何以 GNUstep Make 建立 Objecitve-C 專案。由於 GNU Make 是跨平台的,GNUstep 專案可在不同平台間流通,但由於不同 Objective-C 編譯器間 ABI 不完全相容,無法單憑 GNUstep 專案通吃所有的平台。我們會集中在後文介紹 GNUstep Make 的用法。