前言
Visual Studio 內部的 C 編譯器為 cl.exe
,微軟網站有 cl.exe
參數等相關資料 (像是這裡)。
在大部分情形下,程式設計者會透過 Visual Studio 間接使用此編譯器,甚少直接從命令列呼叫該編譯器。不過,我們有時會從終端機呼叫 cl.exe
,像是要撰寫跨平台的 Makefile 時,就會用到 cl.exe
的命令列參數。此外,熟悉 cl.exe
的參數後,也可在 Visual Studio 中調整相關參數。
基本指令
最簡單的使用方式如下:
> cl hello.c
> .\hello.exe
本文的目的是整理一些常見的使用情境,一開始沒用到的話也不用死背這些指令。
檢查編譯器版本
單獨輸入 cl
指令可檢視該編譯器的版本:
> 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
參數可以開啟所有警告訊息,對修改程式有一些幫助;但 /Wall
會有過多的偽陽性,在實務上其實不好用,比較好用的參數是 /W4
(參考這裡)。
使用 /sdl
參數可再多開啟一些和安全性相關的警告訊息。
使用範例如下:
> cl /W4 /sdl /Fe:program.exe source.c
開啟除錯訊息
使用 /Zi
參數可在編譯程式時額外產生一些除錯相關的訊息。
選擇最佳化策略
cl
常見的最佳化參數套餐如下:
/Od
:關閉最佳化,預設情境/O1
:最省空間的最佳化/O2
:最佳速度的最佳化/Os
:偏向節省空間的最佳化/Ot
:偏向改善速度的最佳化
除此之外,還有一些細節選項可調。一開始時不用耗費過多時間在調最佳化參數上面,在最後要發布程式時再來費心選擇即可。
指定 C 標準 (C Standard) 的版本
Visual C++ 可以指定以下 C 標準:
/std:c11
/std:c17
不使用參數時,則使用原本的 MSVC 所支援的 C 標準,相當於 C99 和部分 C11。
Visual C++ 預設會開啟 Microsoft 延伸特性。如果想要在 ANSI C 模式下編譯 C 程式碼,可以加上 /Za 參數。但撰寫 Win32 API 程式時,基本上無法使用 /Za 參數,因為 Win32 API 本身就不遵守 ANSI C 標準。
連結外部檔案
使用 /I
參數可在編譯時加入外部路徑,如下例:
> for %x in (*.c) do cl /c %x
> cl /Fe:program.exe *.obj /I\include
編譯函式庫
編譯靜態函式庫可參考以下指令:
> for %x in (*.c) do cl /c %x
> lib /out:something.lib *.obj
Visual C++ 的靜態函式庫的副檔名是 .lib ,而非 .a 。
編譯動態函式庫可參考以下指令:
> for %x in (*.c) do /c %x
> link /DLL /OUT:something.dll *.obj
Windows 上的動態函式庫的副檔名是 .dll 而非 .so 。