[C 語言] 程式設計教學:在 MacOS 上建立 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,這是一個知名的軟體編譯系統,可以減輕我們的工作量。

    【分享本文】
    Facebook Twitter LinkedIn LINE Skype EverNote GMail Yahoo Email
    【追蹤新文章】
    Facebook Twitter Plurk