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

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

前言

程式設計者通常是在 Visual Studio 中間接呼叫 Visual C++ 內附的編譯器,直接使用指令的機會較少。學習的重點在於學習參數的設置方式,必要時可在 IDE 中修改。

如果需要自行撰寫 Makefile 等跨 IDE 的專案設定檔時,就有可能需要學習如何在終端機環境中使用 Visual C++。

基本的使用方式

一開始先知道以下指令即可:

> cl program.cc
> .\program.exe

在預設情形下,執行檔會和原始碼同名。如果需要更動執行檔的名稱,則加上 /Fe 參數。虛擬指令如下:

> cl /Fe:program source.cc
> .\program.exe

檢查 Visual C++ 版本

不加任何參數時,可以顯示 Visual C++ 的版本號:

> cl
Microsoft (R) C/C++ Optimizing Compiler Version 19.29.30040 for x64
Copyright (C) Microsoft Corporation.  著作權所有,並保留一切權利。

不同版本的編譯器的特性和臭蟲相異。確認自己使用的編譯器版本有時會對處理問題有所幫助。

加入警告訊息

以下是 Visual C++ 中和警告訊息相關的參數:

  • /W1:Level 1 警告
  • /W2:Level 2 警告
  • /W3:Level 3 警告
  • /W4:Level 4 警告
  • /Wall:開啟所有警告
  • /sdl:啟用其他安全性功能和警告
  • /WX:將警告視為錯誤

使用警告訊息的虛擬指令如下:

> cl /W4 /sdl /Fe:program source.cc

有些警告是無害的,不需要刻意開啟 /WX 參數。

實際上,/Wall 有過多的偽陽性報告,使用 /W4 反而比較好 (出處)。

加入除錯訊息

編譯時加入 /Zi 參數,可以在執行檔中加入除錯相關資訊。由於除錯訊息對執行程式沒有幫助,程式要上線時,最好關掉這個參數後,重新編譯程式。

最佳化

以下是 Visual C++ 提供的最佳化參數:

  • /Od:關閉最佳化 (預設值)
  • /O1:最省空間的最佳化
  • /O2:最佳速度的最佳化
  • /Os:偏向節省空間的最佳化
  • /Ot:偏向改善速度的最佳化
  • /favor::針對特定 CPU 的最佳化
    • blend:64 位元 CPU
    • AMD64:AMD 64 位元 CPU
    • INTEL64:Intel 64 位元 CPU
    • ATOM:Intel ATOM CPU

最佳化對執行程式有影響,但對學習 C++ 語法沒有幫助。所以不需要在這些參數糾結過久。

編譯多個檔案

剛開始學習 C++ 時,程式碼很短,寫在單一檔案即可。實務上的 C++ 程式會拆分在多個檔案中。本節介紹編譯多個 C++ 檔案的方式。

使用單一指令

使用以下虛擬指令可以用單一指令將多個 C++ 原始碼編譯成執行檔:

> cl /Fe:program a.cc b.cc c.cc

拆成多個步驟

先將原始碼編譯成目的檔:

> cl /c a.cc b.cc c.cc

再將目的檔編譯成執行檔:

> cl /Fe:program a.obj b.obj c.obj

指定 C++ 標準版本

使用 /std: 參數可指定 C++ 標準的版本。以下是可用的版本:

  • c++14
  • c++17
  • c++20
  • c++latest:功能隨時變動

如果想要撰寫標準 C++,可再搭配 /permissive- 參數,停用非標準 C++ 的語法。

以下是相關的虛擬指令:

> cl /std:c++14 /permissive- /Fe:program source.cc

加入外部函式庫

使用 /I 參數可指定標頭檔 (header) 的位置:

> cl /Fe:program source.cc mylib.lib /I.\path\to\include

編譯函式庫

函式庫是 C++ 用來共享程式的方式。本節介紹編譯函式庫的方式。

編譯靜態函式庫

先將原始碼編譯成目的檔:

> cl /c a.cc b.cc c.cc

再將目的檔編譯成靜態函式庫:

> lib /out:something.lib *.obj

編譯動態函式庫

先將原始碼編譯成目的檔:

> cl /c a.cc b.cc c.cc

使用 Visual C++ 編譯函式庫時,不需要區分目的檔所用的參數。

再將目的檔編譯成動態函式庫:

> link /DLL /OUT:something.dll *.obj
關於作者

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

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