在 Windows 上建立 C 語言開發環境

    前言

    比起 Unix 或類 Unix 系統,Windows 對於 C 語言的原生支援較薄弱,缺乏單一最佳方案。目前來說,有以下四種方案:

    • Visual C++
    • Cygwin
    • WSL (Windows Subsystem for Linux) (Windows 10 限定)
    • MinGW + MSYS

    選擇 C 開發環境時,會從 C 編譯器、編輯器、專案管理軟體、套件管理軟體等方面來思考。本文列出在 Windows 上常見的選擇。

    C 編譯器

    C 編譯器包括編譯器本身和標準函式庫兩部分。這兩個部分會包在一起,安裝 C 編譯器時即一併安裝。本節介紹數個常見的選項。

    Visual C++

    Visual C++ 是隨附在 Visual Studio 內的 C 和 C++ 編譯器。安裝 Visual Studio Community 時,一併安裝 C++ 開發環境即可。安裝完後,會得到 C 和 C++ 編譯器及一套完整的 IDE (整合式開發環境),可以在完全不使用命令列工具的前提下學 C 語言,所以相當受歡迎。

    然而,Visual C++ 在 C 標準上落後,而且微軟看起來沒有要更新該編譯器的 C 標準。如果有心要學現代 C 語言,或是注重 C 標準的版本差異的話,不建議使用 Visual C++ 來學。但 Visual Studio 相當普遍,如果只是要學 C 基本語法,繼續使用 Visual C++ 無妨。

    如果只是想用 Visual C++ 編譯 C 程式,但是不需要 Visual Studio 的 IDE 的話,可以考慮下載 Build Tools for Visual Studio。目前 (西元 2019 年年末) 能下載到的有分兩個版本:

    下載後,同樣可以按照自己的需求選擇所需的元件,就和使用 Visual Studio 的安裝器雷同。

    當我們安裝 Build Tools for Visual Studio 後,由於沒有 IDE 可用,得自行搭配其他的 IDE。常見的選項有 Code::Blocks 或 KDevelop 等。

    微軟希望大家直接去用 Visual Studio,所以對 Build Tools for Visual Studio 不太去宣傳,只是低調地放個連結給人下載。但微軟也沒把這些連結拿掉,代表這個工具還是有其需求。依筆者自己的推測,Build Tools for Visual Studio 主要是用在 Docker for Windows 這類純命令列環境的情境,而不是給一般開發者使用。

    Cygwin 內的 GCC

    Cygwin 是一套運行在 Windows 上的類 Unix 子系統,主要的用途是在 Windows 上使用類 Unix 系統的命令列環境、命令列工具、開發工具等。為了要讓 Cygwin 支援 POSIX,Cygwin 附帶了一隻額外的 DLL (動態連結函式庫)。故在 Cygwin 下編譯的程式皆會依賴該 DLL。

    我們會把 Cygwin 視為非 Windows 非 GNU/Linux 的特殊子系統。如果只是要拿內附的 GCC 等開發工具來練習 C 語言倒是無妨。如果想要開發 Windows 原生程式的話,還是使用其他的方案比較好。

    Windows Subsystem for Linux 內的 GCC

    WSL (Windows Subsystem for Linux) 是一套運行在 Windows 上的 GNU/Linux 子系統,主要目的是提供類 Unix 系統上的開發工具。原本的 WSL 是以 Linux 相容介面來運行,內部沒有真正的 Linux 核心。在 WSL2 後,會在該子系統內放入真正的 Linux 核心,利用虛擬化技術來運行。

    由於 WSL 是相對新穎的軟體專案,該專案仍在演進中。有時候會在 WSL 上碰到在原生類 Unix 系統上沒有的問題,這些問題可能難以解決或無法解決。故現階段不建議使用 WSL 來練習 C 語言。

    MinGW + MSYS

    MinGW 是 GCC 在 Windows 上的移植品,提供 C 和 C++ 編譯器、C 和 C++ 標準函式庫、開發工具等。但沒有第三方函式庫也沒有編輯器,這些部分要另外安裝。至於 MSYS 則是隨附在 MinGW 內的小型類 Unix 子系統,主要用來移植來自類 Unix 系統的自由軟體。

    原本的 MinGW 較不親民,後來有開發團隊製作 MSYS2。相較於 MinGW,MSYS2 除了提供 C 開發環境外,還加入套件管理軟體,要安裝第三方函式庫就方便得多了。但是編輯器的部分仍需另外安裝。

    編輯器或 IDE

    編輯器或 IDE 是用來撰寫程式碼的軟體。兩者的差別在於前者功能較單純,專注在撰寫程式碼本身;後者則加入較多功能,像是除錯、重構、專案管理、版本控制等。其實編輯器或 IDE 和 C 編譯器是脫勾的,但 Visual Studio 是少數將兩者同捆的例外之一。

    本節介紹一些在 Windows 上常見的選項。

    Visual Studio

    Visual Studio 是微軟官方的 C 和 C++ IDE。由於裝好 IDE 後就可以取得完整的開發環境,故很受歡迎。但 Visual Studio 只能搭配自家的 Visual C++,無法選擇其他的 C 和 C++ 編譯器。原本 Visual Studio 也只使用自家的 MSBuild 來管理專案,後來採取較開放的態度,開始接受 CMake 組態的專案。

    CLions

    CLions 是一套跨平台的 C 和 C++ IDE。該 IDE 是商業軟體,但提供 30 天試用,可充份體驗後再決定是否要付費。CLions 沒有內建的 C 編譯器,但主流的 C 編譯器均有支援。除了 C 和 C++,CLions 還支援 Objective-C、Python、網頁前端等多種語言。

    為了能夠在不同平台下管理專案,CLions 採用 CMake。雖然有一些 CLions 使用者希望 CLions 能夠加入 Makefile 的支援,但 CLions 目前不支援 Makefile。可能的原因是 Make 程式在不同平台間的歧異較大。

    不過,CLions 提供一些外掛 (plugins) 來間接支援 Makefile,有需要的讀者可以參考一下。

    Code::Blocks

    Code::Blocks 是一套跨平台的 C、C++、Fortran IDE,不僅開放原始碼還可免費取得。該 IDE 沒有內建的 C 編譯器,可和多種 C 編譯器搭配,包括 MinGW。然而,Code::Blocks 不接受 CMake 或 Make 組態的專案,而是使用自家的專案管理程式。

    KDevelop

    KDevelop 是一套基於 Qt 的跨平台 C 和 C++ IDE,本身是可免費取得的自由軟體。該 IDE 沒有內建的 C 編譯器,可搭配多種 C 編譯器,包括 Visual C++ 及 MinGW。雖然 KDevelop 的名氣不若前述各 IDE 響亮,此 IDE 支援 CMake、QMake、Make 等多種組態的專案,相當方便。

    不要用 Dev-C++

    Dev-C++ 是一套免費的 C 或 C++ IDE,在台灣的大專院校間很流行。但我們不應再使用 Dev-C++。

    Dev-C++ 會紅的原因是早期的 Visual Studio 很貴,免費的 Express 版本功能限制多,所以大家會轉而使用 Dev-C++。但 Dev-C++ 本身已經不再維護了,而且 Visual Studio Community 的功能也相當完整,沒有理由繼續使用 Dev-C++。

    其他編輯器

    大部分編輯器對 C 都有基本的支援。對於小型檔案,不一定要開 IDE 來用。以下是一些常見的編輯器:

    • Atom
    • Sublime Text
    • Visual Studio Code (VSCode)
    • Nodepad++ (Windows 限定)
    • Vim
    • Emacs

    在這些編輯器中,VSCode 是近年來竄升最快的編輯器。該編輯器不僅跨平台,有著豐富的外掛,還支援多種語言,是輕量編輯的最佳選擇。

    管理 C 專案

    C 語言本身沒有專案的概念,由各個系統自行提供專案管理方案。常見的有以下數種方案:

    • 使用 IDE 內建的專案管理軟體
    • 使用 Make
    • 使用 CMake
    • 使用其他專案管理軟體

    對於初學者來說,當下的學習重點在於學會 C 的核心功能,不應耗費過多時間在專案組態上。所以直接使用 Visual Studio 或 Code::Blocks 這類內建專案管理功能的 IDE 無妨。

    若是要對外發佈的專案,則不應綁死特定 IDE,這時候應該用 Make、CMake 等不綁定 IDE 的專案管理工具。直接使用 Visual Studio 來管理專案的前提是該專案只會在 Windows 上發佈。

    安裝第三方函式庫

    在程式寫到一定規模後,標準函式庫會不敷使用,這時候就會尋求適合的第三方函式庫。C 語言有函式庫的格式但沒有套件的概念。在 Windows 上也沒有 /usr/include/usr/lib 等系統內定函式庫路徑,而是用手動的方式將函式庫的標頭檔及二進位檔拷貝到專案中。

    但純手動不易管理,所以發展出下列安裝及管理第三方套件的方式:

    • 使用 vcpkg
    • 使用 MSYS2 內附的 Pacman

    vcpkg 是微軟自家的第三方套件管理軟體。該專案為許多受歡迎的 C 或 C++ 函式庫寫 CMake 組態,再利用 vcpkg 主程式來自動安裝這些函式庫。但目前的 vcpkg 無法自行設置套件的編譯參數,而且只能搭配 Visual C++。

    Pacman 原本是 Arch Linux 的套件管理軟體,MSYS2 專案將其移植到 Windows 上,用來搭配 MinGW。同樣地,MSYS2 專案預先將許多受歡迎的 C 或 C++ 函式庫包成套件,所以可以自動安裝。

    為什麼會有兩套重覆功能的套件管理軟體?這是為了搭配不同的 C 編譯器所致。

    如何選擇?

    由於 Cygwin 及 WSL 需在子系統中運行,故先排除。實際在選擇時,就是在 Visual C++ (MSVC) 及 MinGW (GCC) 兩大 C 編譯器系統擇一。

    如果程式只要在 Windows 上跑,可以直接用 Visual Studio 全家餐,就會有完整的 C 編譯器 (Visaul C++) 及 IDE。頂多在需要第三方函式庫時拉 vcpkg 來用。

    如果程式需要在多個平台上運行,就應該用 MinGW (GCC)。這時候的組合會是 MSYS2 + Make (或 CMake) + 第三方編輯器 (或 IDE)。

    對於初學者來說,Visual Studio 或 Code::Blocks 這類內建專案管理功能的 IDE 比較方便。但在跨過新手階段後,應該要試著用 CLions 或 KDevelop 這類可跨平台的 IDE,並用 CMake 或 Make 管理專案。

    動手做時間:使用 MinGW (MSYS2) 搭配 Code::Blocks

    綜合以上的想法,筆者建議以下的組合 (擇一即可):

    • MSYS2 搭配 Code::Blocks
    • MSYS2 搭配 Visual Studio Code

    Code::Blocks 的好處在於本身為跨平台軟體,可在 Windows、GNU/Linux、Mac 下執行;此外,Code::Blocks 可選用內建的專案管理程式或 Makefile,對初學者來說,可先用內建的專案管理系統減輕學習的負擔,上手後再慢慢轉到 Makefile。如果要用 Visual Studio Code,建議學一些基本的 Makefile 撰寫方式,簡化編譯軟體的過程。

    接下來,我們用經典的 Hello World 範例來說明如何在 Windows 下撰寫 C 語言。使用 IDE 的讀者,請建立一個終端機程式的專案,使用編輯器的讀者,可建立 hello.c 檔案 (也可用其他名稱,建議用英文來命名)。我們這裡以 Code::Blocks 為例,來展示建立專案過程。

    如果 Code::Blocks 無法抓到 GCC (MinGW) 的路徑,需手動修改 GCC 路徑 (從 Settings 的 Compiler 選單選擇):

    Code::Blocks 設定編譯器路徑

    選擇專案類型,這裡選「Console application」:

    Code::Blocks 選擇專案類型

    這裡會出現一個額外的提示畫面,僅僅是歡迎訊息,直接選 Next 即可:

    Code::Blocks 歡迎訊息

    選擇專案語言,記得要選 C,不要選 C++,因為 C++ 並不是 C 的超集合 (superset):

    Code::Blocks 選擇專案諨言

    設置專案名稱和路徑:

    Code::Blocks 設置專案名稱和路徑

    選擇編譯器,這裡選 GCC 即可:

    Code::Blocks 選擇編譯器

    進入 Code::Blocks 的編輯器,開始撰寫程式:

    Code::Blocks 編輯器主畫面

    撰寫第一個程式

    我們這裡展示 Hello World 程式,暫時不要管程式碼的意義,這裡的重點是確保程式可順利運行:

    #include <stdio.h>
    
    int main()
    {
        printf("Hello World\n");
        
        return 0;
    }
    

    如果使用 IDE 的讀者,選取執行 (Run) 或等效的指令即可執行。如果使用編輯器的讀者,可參考以下終端機指令:

    C:\> gcc -o hello hello.c
    C:\> hello
    Hello World
    

    對於初期的練習,使用上述方法應該足夠。但若讀者在終端機環境中編譯 C 程式碼,久了應該會覺得反覆打指令很費時;我們在這裡介紹 GNU Make,這是一個知名的軟體編譯系統,可以減輕我們的工作量。

    電子書籍

    如果你覺得這篇 C 語言的技術文章對你有幫助,可以看看以下完整的 C 語言程式設計電子書:

    現代 C 語言程式設計

    【分享本文】
    Facebook Twitter LinkedIn LINE Skype EverNote GMail Yahoo Yahoo
    【追蹤本站】
    Facebook Facebook Twitter