Visual Stdio C++ 編譯器、鏈接器常用命令行 (轉)
阿新 • • 發佈:2018-01-18
線程 dna pretty 文件 入口 all 如果 name -o2
以前使用 Visual Stdio 都是在 IDE 環境下。這兩天編譯 GSL 感覺用 IDE 環境特別不方便,所以就花了點時間簡單學習了如何在命令行下使用 Visual Stdio C++ 編譯器、連接器。
我個人對 gcc 還是比較熟悉的,所以這裏的各種用法都做了 gcc 的類比,這樣也便於記憶。
編譯器 CL
Visual Stdio 中的 C/C++ 編譯器都是同一個,叫做 CL。下面表格列出了一些基本的命令行選項。
CL | gcc | 說明 |
---|---|---|
/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鏈接 |
除了這些,還有不少的命令行選項,不過一般用途來說,這些就夠用了。
連接器 link
對應 gcc 工具鏈中的 ld。
link | ld | 說明 |
---|---|---|
/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++ 編譯器、鏈接器常用命令行 (轉)