位元詩人 [C 語言] 程式設計教學:如何在終端機中使用 Visual C++

C 語言編譯器
Facebook Twitter LinkedIn LINE Skype EverNote GMail Yahoo Email

前言

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

關於作者

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

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