C 語言程式設計教學:以 Visual C++ 編譯 C 程式

PUBLISHED ON MAY 31, 2018 — PROGRAMMING

    Visual Studio 內部的 C 編譯器為 cl.exe,微軟網站有 cl.exe 參數等相關資料 (像是這裡)。在大部分情形下,一般程式設計者會透過 Visual Studio 間接使用此編譯器,甚少直接從命令列呼叫該編譯器;不過,我們有時會從終端機呼叫 cl.exe,像是要撰寫跨平台的 Makefile 時,就會用到 cl.exe 的命令列參數。此外,熟悉 cl.exe 的參數後,也可在 Visual Studio 中調整相關參數。

    最簡單的使用方式如下:

    C:\> cl hello.c
    C:\> .\hello.exe

    本文的目的是整理一些常見的使用情境,一開始沒用到的話也不用死背這些指令。

    檢查編譯器版本

    單獨輸入 cl 指令可檢視該編譯器的版本:

    C:\> cl
    Microsoft (R) C/C++ Optimizing Compiler Version 19.13.26131.1 for x64
    Copyright (C) Microsoft Corporation.  All rights reserved.
    
    usage: cl [ option... ] filename... [ /link linkoption... ]

    如果在程式討論區,提供編譯器的版本偶爾會得到一些有用的回應。比較簡單的替代方法是提供 Visual Studio 的版本。

    警告訊息

    使用 /Wall 參數可以開啟所有警告訊息,對修改程式有一些幫助。

    使用 /sdl 參數可再開啟一些和安全性相關的警告訊息。

    使用範例如下:

    C:\> cl /Wall /sdl /Fe:hello.exe hello.c

    除錯訊息

    使用 /Zi 參數可在編譯程式時額外產生一些除錯相關的訊息。

    最佳化

    cl 常見的最佳化參數如下:

    • /Od:關閉最佳化,預設情境
    • /O1:最省空間的最佳化
    • /O2:最佳速度的最佳化
    • /Os:偏向節省空間的最佳化
    • /Ot:偏向改善速度的最佳化

    除此之外,還有一些細節選項可調。一開始時不用耗費過多時間在調最佳化參數上面。

    指定 C 語言版本

    很遺憾地,Visual C++ 官網沒有提到其 C 編譯器的 C 標準支援到什麼程度,也無法在編譯時指定 C 標準的版本。從一些網路上相關的文章間接可知,目前大概僅支援一部分的 C99。相較於 C++ 標準,Visual C++ 對 C 標準的實作步調緩慢,短期內不會立即改善。如果沒有非得用 Visual C++,倒可用 MinGW (GCC 的移植品) 或其他的 C 編譯器。

    連結外部檔案

    使用 /I 參數可在編譯時加入外部路徑,如下例:

    C:\> for %x in (*.c) do cl /c %x
    C:\> cl /Fe:prog.exe *.obj /I\include

    編譯函式庫

    編譯靜態函式庫可參考以下指令:

    C:\> for %x in (*.c) do cl /c %x
    C:\> lib /out:something.lib *.obj

    Visual C++ 的靜態函式庫的副檔名是 *.lib*,而非 *.a*。

    編譯動態函式庫可參考以下指令:

    C:\> for %x in (*.c) do /c %x
    C:\> link /DLL /OUT:something.dll *.obj

    Windows 上的動態函式庫的副檔名是 *.dll*。