位元詩人 [C 語言] 程式設計教學:在 macOS 上建立 C 語言開發環境

C 語言開發環境
Facebook Twitter LinkedIn LINE Skype EverNote GMail Yahoo Email

前言

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」:

Xcode 選擇專案類型

設置專案的名稱:

Xcode 設置專案名稱

設置專案存放的位置,這裡選 Documents (文件) (可選其他位置):

Xcode 設置專案位置

進入 Xcode 的編輯器,可以開始撰寫程式碼:

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,這是一個知名的軟體編譯系統,可以減輕我們的工作量。

關於作者

身為資訊領域碩士,位元詩人 (ByteBard) 認為開發應用程式的目的是為社會帶來價值。如果在這個過程中該軟體能成為永續經營的項目,那就是開發者和使用者雙贏的局面。

位元詩人喜歡用開源技術來解決各式各樣的問題,但必要時對專有技術也不排斥。閒暇之餘,位元詩人將所學寫成文章,放在這個網站上和大家分享。