1. 程式人生 > >Visual Stdio C++ 編譯器、鏈接器常用命令行 (轉)

Visual Stdio C++ 編譯器、鏈接器常用命令行 (轉)

線程 dna pretty 文件 入口 all 如果 name -o2

以前使用 Visual Stdio 都是在 IDE 環境下。這兩天編譯 GSL 感覺用 IDE 環境特別不方便,所以就花了點時間簡單學習了如何在命令行下使用 Visual Stdio C++ 編譯器、連接器。

我個人對 gcc 還是比較熟悉的,所以這裏的各種用法都做了 gcc 的類比,這樣也便於記憶。

編譯器 CL

Visual Stdio 中的 C/C++ 編譯器都是同一個,叫做 CL。下面表格列出了一些基本的命令行選項。

CLgcc說明
/E -E 輸出預處理結果
/Fa -S 輸出匯編文件
/Za -ansi 禁止語言擴展,這兩個還不是等價的
/Dname -Dname 定義一個宏,相對於在代碼中添加了 #define name
/Dname=value -Dname=value 定義一個宏,相對於在代碼中添加了 #define name value
/Wall -Wall 將所有的警告信息全開。
/Od -O0 禁止優化
/O1 -Os 以最節省空間為目標優化
/O2 -O2 以允許速度最快為目標優化
/Idirecotry -Idirecotry 指定頭文件搜索路徑
/c -c 生成目標文件 .obj, 不鏈接
/libpath:direcotry -Ldirecotry 指定庫文件搜索路徑(MSVC的/libpath屬於鏈接選項,第一個鏈接選項之前要指定/link選項,用來告訴編譯器驅動,後續選項傳給鏈接器使用)
/GR,/GR- -frtti,-fno-rtti 開啟或關閉RTTI
/link -Wl 鏈接指定的模塊或給鏈接器傳遞參數
/LD -shared 編譯產生DLL文件
/LDd 編譯產生DLL文件(調試版)
/MD 與動態多線程版本運行庫MSVCRT.LIB鏈接
/MDd 與調試版動態多線程版本運行庫MSVCRTD.LIB鏈接
/MT 與靜態多線程版本運行庫LIBCMT.LIB鏈接
/MTd 與調試版靜態多線程版本運行庫LIBCMTD.LIB鏈接

除了這些,還有不少的命令行選項,不過一般用途來說,這些就夠用了。

對應 gcc 工具鏈中的 ld。

linkld說明
/BASE:address 指定輸出文件的基地址
/DEBUG 輸出調試模式版本
/DEF:filename 指定模塊定義文件.DEF
/DEFAULTLIB:library 指定默認運行庫
/DLL –relocateable 產生DLL
/ENTRY:symbol –entry=symbol 指定程序入口
/EXPORT:symbol 指定某個符號位導出符號
/HEAP 指定默認堆大小
/LIBPATH:dir 指定鏈接時庫搜索路徑
/MAP:MAPFILE -Map MAPFILE 產生鏈接MAP文件
/NODEFAULTLIB 禁止默認運行庫
/OUT:name -o name 指定輸出文件名為 name
/STACK 指定默認棧大小
/SUBSYSTEM 指定子系統,常見選項是 windows 和 console

生成靜態庫. lib

lib 可以將一系列的 obj 文件打包為一個靜態庫 .lib。也可以將幾個 .lib 合成一個 .lib。或者將幾個 .obj 和 .lib 合成一個 .lib。

比如我們有 add.obj sub.obj div.lib 這三個文件,我們想將他們合成為一個 all.lib。
那麽可以這樣:

lib add.obj sub.obj div.lib /out:all.lib

如果要將這三個文件合並為一個 all.dll 那麽我們還需要個 .def 文件。裏面給出哪些符號要導出。
類似下面這個樣子:

LIBRARY   all.dll
EXPORTS
   add
   sub
   div

之後執行 link 命令:

link /SUBSYSTEM:windows /dll /def:all.def /out:all.dll add.obj sub.obj div.lib

 

Visual Stdio C++ 編譯器、鏈接器常用命令行 (轉)