前言
macOS 本質上是一種 BSD 系統,在 C 語言的支援上自然比 Windows 好得多。但蘋果公司不甚注重傳統 Unix 程式設計的發展,等於是只有半套功能的 Unix 系統。所幸,有社群方案可以補足不足的地方,使用起來和 GNU/Linux 等類 Unix 系統的體驗不會差太多。
C 編譯器
macOS 上預設的 C 編譯器是 Clang,但是也可以自行安裝 GCC 來用。雖然 Clang 有許多參數刻意和 GCC 相容,但兩者仍有一些特性是相異的,所以兩者無法直接相互取代。
編輯器或 IDE
雖然 macOS 也有命令列環境可用,但 macOS 一定會有桌面環境可用,所以不需刻意去用命令列環境中的編輯器。本文介紹數個在 macOS 中可用的編輯器或 IDE。
Xcode
Xcode 是 macOS 預設的 IDE。由於歷史因素,Xcode 可用來寫 C、C++、Objective-C、Swift 等語言。在 Mac 生態圈的思維中,使用者介面是以 Objective-C 或 Swift 來寫,C 或 C++ 只用在非使用者介面的部分。早期的 C 使用者介面函式庫 Carbon 已經在新版的 macOS 中移除了,所以不應該再去學 Carbon。
但 Xcode 算是肥大的軟體,如果沒有要寫 Objective-C 或 Swift 程式的話,可以用其他較輕量的 IDE 來代替。
CLions
CLions 是一套跨平台的 C 和 C++ 商業 IDE,也可以在 macOS 上使用。CLions 本身不自帶 C 編譯器,但可搭配多種外部 C 編譯器,包括 Clang。
為了要在異質平台上管理 C 專案,CLions 直接使用 CMake 來管理專案。雖然有些 CLions 使用者希望 CLions 能支援 Make,但 CLions 官方團隊目前沒有支援 Make 的打算。如果真的想用 Make 的話,倒是可以透過一些外掛來獲得對 Makefile 的間接支援。
Code::Blocks
Code::Blocks 是一套跨平台的 C、C++、Fortran 等多種語言的 IDE,也可以在 macOS 上使用。但 Code::Blocks 開發團隊目前似乎缺 macOS 版本的維護者,在筆者撰寫文章的時候 (西元 2019 年年末),macOS 版本的 Code::Blocks 版本有點滯後。
Code::Blocks 不自帶 C 編譯器,可搭配多種 C 編譯器使用,包括 Visual C++、GCC、Clang 等。但 Code::Blocks 使用自帶的專案管理軟體,無法直接使用 CMake 或 Make。如果專案有跨平台的需求,就不適合用 Code::Blocks 來管理。
KDevelop
KDevelop 是一套跨平台的 C、C++、Python、PHP 等多種語言的 IDE。目前在 macOS 上的版本仍是預覽版。
KDevelop 不自帶 C 編譯器,可和系統預設的 C 編譯器搭配使用。此外,KDevelop 可以直接吃入以 Make、CMake、QMake 等多種自動編譯軟體管理的專案。所以,如果需要一個免費 IDE,且專案有跨平台的需求,倒是可以考慮使用 KDevelop。
其他編輯器
除了上述 IDE 外,對於小型練習程式來說,也可以直接用編輯器來寫。以下是一些常見的跨平台編輯器:
- Atom
- Sublime Text
- Visual Studio Code (VSCode)
- Vim
- Emacs
由於 Vim 和 Emacs 上手難度較高,沒學過的讀者不用一開始就刻意去學。可以先試其他比較易上手的編輯器。
管理 C 專案
在寫 C 程式時,要根據自己的目的來選 C 專案的管理方式。對於初期的語法練習,直接使用 IDE 內建的專案管理比較簡單。因為這時候的重心在學習語法上,管理專案算是額外的工作,能省就省。
如果是要公開發佈或是團隊協作的 C 專案,則要慎選自動編譯軟體。多會使用 Make 或 CMake 這類跨平台的自動編譯軟體來管理專案,而不會用 IDE 來管理專案。因為要考慮團隊成員可能使用相異的平台或工具來撰寫程式。
這篇文章有更多 C 專案的說明,有興趣的讀者可以看一看。
安裝第三方函式庫
雖然 macOS 是 BSD 系統,卻沒有官方的套件管理軟體。這是因為蘋果公司把 macOS 視為開發 iOS 和 macOS 的平台,較不注意傳統的 Unix 程式設計。目前這個議題由社群方案來補足。最常見的套件管理軟體是 Homebrew 和 MacPorts。
Homebrew
Homebrew 是一套以 Ruby 實作的套件管理軟體,應該是目前最多人使用的套件管理軟體。
由於 Homebrew 預設把套件裝在 /usr/local 目錄的子目錄,不會覆寫系統上的同名軟體。此外,Homebrew 在預設情形下會避開系統上已有的 C 函式庫,不用擔心在編譯 C 程式時相依到某個 Homebrew 套件。
MacPorts
MacPorts 是一套以 Tcl 實作的套件管理軟體,目前 MacPorts 使用者沒有 Homebrew 使用者來得多,但仍然有持續維護,而且套件也不少。
MacPorts 在編譯及安裝時可指定安裝位置。按照 Unix 系統的慣例,常見的安裝位置有 /usr/local 或 /opt 。讀者也可以視需求將 MacPorts 安裝到其他位置。MacPorts 會把軟體相依性限制在安裝位置內,不會影響到系統目錄及檔案。
使用 Homebrew 或 MacPorts 的注意事項
最好不要混用套件管理軟體,以免發生預期外的錯誤。標準做法是移除其中一套軟體後,再安裝另外一套。
動手做時間:使用 Xcode 建立 C 專案
接下來,我們用經典的 Hello World 範例來說明如何在 Mac 下撰寫 C 語言。如果使用 IDE 的讀者,請自行建立一個終端機程式類型專案,如果使用編輯器的讀者,建立一個檔名,像是 hello.c (可取其他檔名,建議用英文命名)。我們這裡以 Xcode 為例:
一開始,先選專案類型,這裡選「macOS」的「Command-Line Tool」:
設置專案的名稱:
設置專案存放的位置,這裡選 Documents (文件) (可選其他位置):
進入 Xcode 的編輯器,可以開始撰寫程式碼:
寫第一個程式
我們這裡展示 Hello World 程式,暫時不要管程式碼的意義,這裡的重點是確保程式可順利運行:
#include <stdio.h>
int main()
{
printf("Hello World\n");
return 0;
}
如果使用 IDE 的讀者,選取執行 (Run) 或等效的指令即可執行。如果使用編輯器的讀者,可參考以下終端機指令:
$ gcc -o hello hello.c
$ ./hello
Hello World
註:Mac 中的 GCC 預設是指向 Clang 的連結,而非 GNU 的 GCC。
如果程式順利執行,代表環境建置成功。若執行失敗,則需根據錯誤訊息來處理。
對於初期的練習,使用上述方法應該足夠。但若讀者在終端機環境中編譯 C 程式碼,久了應該會覺得反覆打指令很費時;我們在這裡介紹 GNU Make,這是一個知名的軟體編譯系統,可以減輕我們的工作量。