Cmake :創建vs的makefile工程(1)

         此模式不依賴IDE,純命令方式編譯工程

1、選擇適合的編譯器版本:

     參考:https://mp.csdn.net/console/editor/html/105390630

2、啓動cmd且對應的vs編譯器的環境變量配置(本文章介紹使用的是vs2010來演示 )

     方法一:在普通cmd下執行 %comspec% /k ""d:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\vcvarsall.bat"" x86

        備註: d:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\ 爲您當前vs安裝目錄

  方法二:在開始菜單欄中選擇對應的cmd啓動,開啓命令方式如下:

         

3、瞭解編譯器cl.exe和link.exe的參數

     3.1 編譯器 cl.exe 的編譯選項 通過 cl /help 查看 (注:當前查看的是vs2010版本)

          官網:https://docs.microsoft.com/en-us/cpp/build/reference/compiler-command-line-syntax?view=vs-2019

                         C/C++ 編譯器選項


                              -優化-

/O1 最小化空間                          /O2 最大化速度
/Ob<n> 內聯擴展(默認 n=0)               /Od 禁用優化(默認)
/Og 啓用全局優化                        /Oi[-] 啓用內部函數
/Os 優選代碼空間                        /Ot 優選代碼速度
/Ox 最大化優化                          /Oy[-] 啓用幀指針省略 

                             -代碼生成-

/GF 啓用只讀字符串池                    /Gm[-] 啓用最小重新生成
/Gy[-] 分隔鏈接器函數                   /GS[-] 啓用安全檢查
/GR[-] 啓用 C++ RTTI                    /GX[-] 啓用 C++ EH (與 /EHsc 相同)
/EHs 啓用 C++ EH (沒有 SEH 異常)        /EHa 啓用 C++ EH (w/ SEH 異常)
/EHc 外部“C”默認爲 nothrow            
/fp:<except[-]|fast|precise|strict> 選擇浮點模式:
    except[-] - 在生成代碼時考慮浮點異常
    fast -“fast”浮點模式;結果可預測性比較低
    precise -“precise”浮點模式;結果可預測
    strict -“strict” 浮點模式(意味着 /fp:except)
即使使用 /fp:except,/Qfast_transcendentals 也生成內聯內部 FP
/GL[-] 啓用鏈接時代碼生成               /GA 爲 Windows 應用程序進行優化
/Ge 對所有函數強制堆棧檢查              /Gs[num] 控制堆棧檢查調用
/Gh 啓用 _penter 函數調用               /GH 啓用 _pexit 函數調用
/GT 生成纖程安全 TLS 訪問               /RTC1 啓用快速檢查(/RTCsu)
/RTCc 轉換爲較小的類型檢查              /RTCs 堆棧幀運行時檢查
/RTCu 未初始化的局部用法檢查            
/clr[:option] 爲公共語言運行時編譯,其中 option 是:
    pure - 生成只包含 IL 的輸出文件(沒有本機可執行代碼)
    safe - 生成只包含 IL 的可驗證輸出文件
    oldSyntax - 接受 Visual C++ 2002/2003 的託管擴展語法
    initialAppDomain - 啓用 Visual C++ 2002 的初始 AppDomain 行爲
    noAssembly - 不產生程序集           /Gd __cdecl 調用約定 
/Gr __fastcall 調用約定                 /Gz __stdcall 調用約定
/GZ 啓用堆棧檢查(/RTCs)                 /QIfist[-] 使用 FIST 而不是 ftol()
/hotpatch 確保可熱修補映像的函數填充    
/arch:<SSE|SSE2|AVX> CPU 架構的最低要求,以下選項之一:
    SSE - 啓用支持 SSE 的 CPU 可用的指令
    SSE2 - 啓用支持 SSE2 的 CPU 可用的指令
    AVX - 支持使用 Intel(R) 高級矢量擴展指令
/Qimprecise_fwaits 僅在“try”邊界而不是“try”內部生成 FWAITs
/Qsafe_fp_loads 生成安全 FP 負載        

                              -輸出文件-

/Fa[file] 命名程序集列表文件            /FA[scu] 配置程序集列表
/Fd[file] 命名 .PDB 文件                /Fe<file> 命名可執行文件
/Fm[file] 命名映射文件                  /Fo<file> 命名對象文件
/Fp<file> 命名預編譯頭文件              /Fr[file] 命名源瀏覽器文件
/FR[file] 命名擴展 .SBR 文件            /Fi[file] 命名預處理的文件
/doc[file] 處理 XML 文檔註釋,並可選擇命名 .xdc 文件

                              -預處理器-

/AI<dir> 添加到程序集搜索路徑           /FU<file> 強制使用程序集/模塊 
/C 不抽出註釋                           /D<name>{=|#}<text> 定義宏
/E 預處理到 stdout                      /EP 預處理到 stdout,無行號
/P 預處理到文件                         /Fx 將插入的代碼合併到文件中
/FI<file> 命名強制包含文件              /U<name> 移除預定義的宏
/u 移除所有預定義的宏                   /I<dir> 添加到包含搜索路徑
/X 忽略“標準位置”                     

                                -語言-

/Zi 啓用調試信息                        /Z7 啓用舊式調試信息
/Zp[n] 在 n 字節邊界上包裝結構          /Za 禁用擴展
/Ze 啓用擴展(默認)                      /Zl 省略 .OBJ 中的默認庫名
/Zg 生成函數原型                        /Zs 只進行語法檢查
/vd{0|1|2} 禁用/啓用 vtordisp           /vm<x> 指向成員的指針類型
/Zc:arg1[,arg2] C++ 語言合規性,這裏的參數可以是:
    forScope[-] - 對範圍規則強制使用標準 C++
    wchar_t[-] - wchar_t 是本機類型,不是 typedef
    auto[-] - 對 auto 強制使用新的標準 C++ 含義
    trigraphs[-] - 啓用三元祖(默認爲關閉)
/ZI 啓用“編輯並繼續”調試信息          /openmp 啓用 OpenMP 2.0 語言擴展

                              - 雜項 -

@<file> 選項響應文件                    /?, /help 打印此幫助消息
/bigobj 生成擴展的對象格式              /c 只編譯,不鏈接
/errorReport:option 將內部編譯器錯誤報告給 Microsoft
    none - 不發送報告                       prompt - 提示立即發送報告
    queue - 在下一次管理員登錄時,提示發送報告(默認)
    send - 自動發送報告                 /FC 診斷中使用完整路徑名
/H<num> 最大外部名稱長度                /J 默認 char 類型是 unsigned
/MP[n] 最多使用“n”個進程進行編譯      /nologo 取消顯示版權信息
/showIncludes 顯示包含文件名            /Tc<source file> 將文件編譯爲 .c
/Tp<source file> 將文件編譯爲 .cpp      /TC 將所有文件編譯爲 .c
/TP 將所有文件編譯爲 .cpp               /V<string> 設置版本字符串
/w 禁用所有警告                         /wd<n> 禁用警告 n
/we<n> 將警告 n 視爲錯誤                /wo<n> 發出一次警告 n
/w<l><n> 爲 n 設置警告等級 1-4          /W<n> 設置警告等級(默認 n=1)
/Wall 啓用所有警告                      /WL 啓用單行診斷
/WX 將警告視爲錯誤                      /Yc[file] 創建 .PCH 文件
/Yd 將調試信息放在每個 .OBJ 中          /Yl[sym] 爲調試庫插入 .PCH 引用
/Yu[file] 使用 .PCH 文件                /Y- 禁用所有 PCH 選項
/Zm<n> 最大內存分配(默認爲 %)           /Wp64 啓用 64 位端口定位警告

                                -鏈接-

/LD 創建 .DLL                           /LDd 創建 .DLL 調試庫
/LN 創建 .netmodule                     /F<num> 設置堆棧大小
/link [鏈接器選項和庫]                  /MD 與 MSVCRT.LIB 鏈接
/MT 與 LIBCMT.LIB 鏈接                  /MDd 與 MSVCRTD.LIB 調試庫鏈接
/MTd 與 LIBCMTD.LIB 調試庫鏈接          

                         -代碼分析-

/analyze[:WX-] 啓用代碼分析             
    WX- - 即使調用了 /WX,也不應將代碼分析警告視爲錯誤

3.2 鏈接器 link.exe 的鏈接選項 通過 link /help 查看 (注:當前查看的是vs2010版本)

     官網:https://docs.microsoft.com/en-us/cpp/build/reference/linker-options?view=vs-2019

LINK /Link for help on Linker
LINK /Lib for help on Library Manager
LINK /Dump for help on Dumper
LINK /Edit for help on Editor
LINK /CvtCIL for help on CvtCIL
LINK /Help for help on Helper

3.3 link /link 鏈接選項

Microsoft (R) Incremental Linker Version 10.00.30319.01
Copyright (C) Microsoft Corporation.  All rights reserved.

 用法: LINK [選項] [文件] [@commandfile]

   選項:

      /ALIGN:#
      /ALLOWBIND[:NO]
      /ALLOWISOLATION[:NO]
      /ASSEMBLYDEBUG[:DISABLE]
      /ASSEMBLYLINKRESOURCE:文件名
      /ASSEMBLYMODULE:文件名
      /ASSEMBLYRESOURCE:文件名[,[名稱][,PRIVATE]]
      /BASE:{地址[,大小]|@文件名,鍵}
      /CLRIMAGETYPE:{IJW|PURE|SAFE}
      /CLRLOADEROPTIMIZATION:{SD|MD|MDH|NONE}
      /CLRSUPPORTLASTERROR[:{NO|SYSTEMDLL}]
      /CLRTHREADATTRIBUTE:{STA|MTA|NONE}
      /CLRUNMANAGEDCODECHECK[:NO]
      /DEBUG
      /DEF:文件名
      /DEFAULTLIB:庫
      /DELAY:{NOBIND|UNLOAD}
      /DELAYLOAD:dll
      /DELAYSIGN[:NO]
      /DLL
      /DRIVER[:{UPONLY|WDM}]
      /DYNAMICBASE[:NO]
      /ENTRY:符號
      /ERRORREPORT:{NONE|PROMPT|QUEUE|SEND}
      /EXPORT:符號
      /FIXED[:NO]
      /FORCE[:{MULTIPLE|UNRESOLVED}]
      /FUNCTIONPADMIN[:大小]
      /HEAP:reserve[,commit]
      /IDLOUT:文件名
      /IGNOREIDL
      /IMPLIB:文件名
      /INCLUDE:符號
      /INCREMENTAL[:NO]
      /KEYCONTAINER:name
      /KEYFILE:文件名
      /LARGEADDRESSAWARE[:NO]
      /LIBPATH:目錄
      /LTCG[:{NOSTATUS|PGINSTRUMENT|PGOPTIMIZE|PGUPDATE|STATUS}]
      /MACHINE:{ARM|EBC|IA64|MIPS|MIPS16|MIPSFPU|MIPSFPU16|
                SH4|THUMB|X64|X86}
      /MANIFEST[:NO]
      /MANIFESTDEPENDENCY:manifest dependency
      /MANIFESTFILE:文件名
      /MANIFESTUAC[:{NO|UAC 片段}]
      /MAP[:文件名]
      /MAPINFO:{EXPORTS}
      /MERGE:from=to
      /MIDL:@commandfile
      /NOASSEMBLY
      /NODEFAULTLIB[:庫]
      /NOENTRY
      /NOLOGO
      /NXCOMPAT[:NO]
      /OPT:{ICF[=迭代數]|NOICF|NOREF|REF}
      /ORDER:@文件名
      /OUT:文件名
      /PDB:文件名
      /PDBSTRIPPED:文件名
      /PGD:文件名
      /PROFILE
      /RELEASE
      /SAFESEH[:NO]
      /SECTION:name,[[!]{DEKPRSW}][,ALIGN=#]
      /STACK:reserve[,commit]
      /STUB:文件名
      /SUBSYSTEM:{BOOT_APPLICATION|CONSOLE|EFI_APPLICATION|
                  EFI_BOOT_SERVICE_DRIVER|EFI_ROM|EFI_RUNTIME_DRIVER|
                  NATIVE|POSIX|WINDOWS|WINDOWSCE}[,#[.##]]
      /SWAPRUN:{CD|NET}
      /TLBID:#
      /TLBOUT:文件名
      /TSAWARE[:NO]
      /VERBOSE[:{ICF|LIB|REF|SAFESEH}]
      /VERSION:#[.#]
      /WX[:NO]

4、dumpbin工具

     dumpbin /EXPORTS “動態庫”(查看動態庫中輸出的接口對象列表),還有其他選項,具體使用請參考官網:

     https://docs.microsoft.com/en-us/cpp/build/reference/dumpbin-options?view=vs-2019

     此命令類似於 linux readelf / objdump / nm 等工具

Microsoft (R) COFF/PE Dumper Version 10.00.30319.01
Copyright (C) Microsoft Corporation.  All rights reserved.

用法: DUMPBIN [選項] [文件]

   選項:

      /ALL
      /ARCHIVEMEMBERS
      /CLRHEADER
      /DEPENDENTS
      /DIRECTIVES
      /DISASM[:{BYTES|NOBYTES}]
      /ERRORREPORT:{NONE|PROMPT|QUEUE|SEND}
      /EXPORTS
      /FPO
      /HEADERS
      /IMPORTS[:文件名]
      /LINENUMBERS
      /LINKERMEMBER[:{1|2}]
      /LOADCONFIG
      /OUT:文件名
      /PDATA
      /PDBPATH[:VERBOSE]
      /RANGE:vaMin[,vaMax]
      /RAWDATA[:{NONE|1|2|4|8}[,#]]
      /RELOCATIONS
      /SECTION:名稱
      /SUMMARY
      /SYMBOLS
      /TLS
      /UNWINDINFO

5、cmd的dos終端中文編碼切換

      5.1 查看當前中文編碼 chcp 下圖的dos中文是 utf-8 ,提示是英文字母

     5.2 切換爲 GBK 的中文編碼 chcp 936

     5.3 切換爲 UTF-8 的中文編碼 chcp 65001

備註:建議源代碼編碼考慮統一使用utf-8,便於跨平臺使用

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章