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*。

comments powered by Disqus