編譯器選項

將msdn上vs2013的編譯器選項記載一下,我不創造文章,我只是大天然的搬運工:node

 

1./STACK(堆棧分配)


/STACK:reserve[,commit]

/STACK 選項設置堆棧的大小(以字節爲單位)。此選項僅在生成 .exe 文件時使用。git

該選項指定虛擬內存中的總的堆棧分配。默認堆棧大小爲 1 MB。連接器將指定值向上舍入爲最接近的 4 個字節。數據庫

commit 取決於操做系統所做的解釋。在 Windows NT 和 Windows 2000 中,它指定一次分配的物理內存量。提交的虛擬內存致使空間被保留在頁面文件中。更高的 commit 值在應用程序須要更多堆棧空間時可節省時間,但會增長內存需求並有可能延長啓動時間。windows

以十進制或 C 語言表示法指定 reserve 值和 commit 值。緩存

設置堆棧大小的另外一種方法是使用模塊定義 (.def) 文件中的 STACKSIZE 語句。若是二者都指定,則 STACKSIZE 重寫堆棧分配 (/STACK) 選項。可使用 EDITBIN 工具在生成 .exe 文件以後更改堆棧。app

在 Visual Studio 開發環境中設置此連接器選項

  1. 打開此項目的「屬性頁」對話框。有關詳細信息,請參見設置 Visual C++ 項目屬性less

  2. 單擊「連接器」文件夾。dom

  3. 單擊「系統」屬性頁。ide

  4. 修改下列任一屬性:函數

    • 堆棧提交大小

    • 堆棧保留大小

 

2./WX(將連接器警告視爲錯誤)


/WX[:NO]

/WX 指示在連接器生成警告的狀況下不生成任何輸出文件。

這與編譯器的 /WX 相似(有關更多信息,請參見 /w、/Wn、/WX、/Wall、/wln、/wdn、/wen、/won(警告等級))。 可是,爲編譯指定 /WX 並不意味着 /WX 在連接階段一樣有效;必須爲每種工具都顯式指定 /WX

默認狀況下,/WX 不起做用。 若要將連接器警告視爲錯誤,請指定 /WX /WX:NO 等同於不指定 /WX

在 Visual Studio 開發環境中設置此連接器選項

  1. 打開項目的「屬性頁」對話框。 有關詳細信息,請參見設置 Visual C++ 項目屬性

  2. 單擊「連接器」文件夾。

  3. 單擊「命令行」屬性頁。

  4. 將該選項鍵入「附加選項」框中。

 

3./HEAP(設置堆大小)


/HEAP:reserve[,commit]

/HEAP 選項設置堆的大小(以字節爲單位)。 此選項僅在生成 .exe 文件時使用。

reserve 參數指定虛擬內存中總的堆分配。 默認堆大小爲 1 MB。 連接器將指定值向上舍入爲最接近的 4 個字節。

可選 commit 參數取決於操做系統的解釋。 在 Windows NT/Windows 2000 中,它指定一次分配的物理內存的數量。 提交的虛擬內存致使空間被保留在頁面文件中。 更高的 commit 值在應用程序須要更多堆空間時可節省時間,但會增長內存需求並有可能延長啓動時間。

以十進制或 C 語言表示法指定 reserve 值和 commit 值。

經過帶 HEAPSIZE 的模塊定義文件也能夠實現該功能。

在 Visual Studio 開發環境中設置此連接器選項

  1. 打開項目的「屬性頁」對話框。 有關詳細信息,請參見設置 Visual C++ 項目屬性

  2. 單擊「連接器」文件夾。

  3. 單擊「系統」屬性頁。

  4. 修改「堆提交大小」屬性。

見圖1

 

4./FORCE(強制文件輸出)


/FORCE:[MULTIPLE|UNRESOLVED]

即便引用了符號但未定義或屢次定義符號,/FORCE 選項也通知連接器建立有效的 .exe 文件或 DLL。

/FORCE 選項能夠帶一個可選參數:

  • 使用 /FORCE:MULTIPLE 可建立輸出文件,而無論 LINK 是否找到了符號的多個定義。

  • 使用 /FORCE:UNRESOLVED 可建立輸出文件,而無論 LINK 是否找到未定義的符號。若是未解析入口點符號,則將忽略 /FORCE:UNRESOLVED。

不帶參數的 /FORCE 表示屢次定義和未解析。

用該選項建立的文件可能不會按預期運行。 當指定 /FORCE 選項時,連接器將不增量連接。

若是使用 /clr 編譯模塊,則 /FORCE 將不會建立映像。

在 Visual Studio 開發環境中設置此連接器選項

  1. 打開項目的「屬性頁」對話框。 有關詳細信息,請參見設置 Visual C++ 項目屬性

  2. 單擊「連接器」文件夾。

  3. 單擊「命令行」屬性頁。

  4. 將該選項鍵入「附加選項」框中。


 
 

5./FIXED(固定基址)


/FIXED[:NO]

通知操做系統只在其首選基址加載程序。 若是首選基址不可用,則操做系統將不加載該文件。 有關詳細信息,請參閱/BASE(基址)

/FIXED:NO 是DLL 的默認設置,/FIXED 是任何其餘項目類型的默認設置。

當指定 /FIXED 時,LINK 不生成程序中的重定位節。 在運行時,若是操做系統沒法在指定的地址加載程序,它將發出錯誤信息而且不加載該程序。

指定 /FIXED:NO 以在程序中生成重定位節。

在 Visual Studio 開發環境中設置此連接器選項

  1. 打開項目的「屬性頁」對話框。 有關詳細信息,請參見使用項目屬性

  2. 選擇 Linker 文件夾。

  3. 選擇「命令行」屬性頁。

  4. 鍵入選項名並在 「其餘選項」 框中設置。

 
  
 

報錯緣由看下面

6./DYNAMICBASE(使用地址空間佈局隨機化功能)


/DYNAMICBASE[:NO]

默認狀況下,/DYNAMICBASE 處於打開狀態。

此選項修改可執行文件頭,以指示是否應在加載時對應用程序隨機從新設定基址。

Windows Vista 支持地址空間佈局隨機化功能。

在 Visual Studio 中設置此連接器選項

  1. 打開此項目的「屬性頁」對話框。 有關更多信息,請參看如何:打開項目屬性頁

  2. 展開「配置屬性」節點。

  3. 展開「連接器」節點。

  4. 選擇「高級」屬性頁。

  5. 修改「隨機基址」屬性。

 

7./DEF(指定模塊定義文件)


/DEF:filename
filename

要傳遞到連接器的模塊定義文件 (.def) 的名稱。

/DEF 選項將模塊定義文件(.def)傳遞到連接器。 只能爲 LINK 指定一個 .def 文件。 有關 .def 文件的詳細信息,請參見模塊定義文件

在 Visual Studio 開發環境中設置此連接器選項

  1. 打開項目的「屬性頁」對話框。 有關詳細信息,請參見設置 Visual C++ 項目屬性

  2. 單擊「連接器」文件夾。

  3. 單擊「輸入」屬性頁。

  4. 修改「模塊定義文件」屬性。

若要從開發環境內指定 .def 文件,應將它連同其餘文件一塊兒添加到項目,而後將該文件指定給 /DEF 選項。

 

模塊定義 (.def) 文件爲連接器提供有關被連接程序的導出、特性及其餘方面的信息。 生成 DLL 時,.def 文件最有用。 因爲存在可代替模塊定義語句使用的連接器選項,一般不須要 .def 文件。 也能夠將 __declspec(dllexport) 用做指定導出函數的手段。

在連接器階段可使用 /DEF(指定模塊定義文件)連接器選項調用 .def 文件。

若是生成的 .exe 文件沒有導出,使用 .def 文件將使輸出文件較大並下降加載速度。

有關示例,請參見使用 DEF 文件從 DLL 導出

.def 這裏不詳述了。。。


8./DEBUG(生成調試信息)


/DEBUG

/DEBUG 選項可爲 .exe 文件或 DLL 建立調試信息。

連接器將調試信息放在程序數據庫 (PDB) 中。 它在後面的程序生成期間更新 PDB。

爲調試建立的 .exe 文件或 DLL 包含相應 PDB 的名稱和路徑。 調試器在您調試程序時讀取嵌入的名稱並使用 PDB。 連接器使用程序的基名稱和擴展名 .pdb 命名程序數據庫,並嵌入它的建立路徑。 若要重寫該默認值,請設置 /PDB 並指定不一樣的文件名。

編譯器的僅限行號 (/Zd) 或 C7 兼容 (/Z7) 選項使編譯器將調試信息保留在 .obj 文件中。 還可使用程序數據庫 (/Zi) 編譯器選項將調試信息存儲在 .obj 文件的 PDB 中。 連接器首先在寫入 .obj 文件的絕對路徑中查找對象的 PDB,而後在包含 .obj 文件的目錄中查找。 不能指定對象的 PDB 文件名或連接器的位置。

指定 /DEBUG 時暗含 /INCREMENTAL

/DEBUG 將 /OPT 選項的默認值從 REF 更改成 NOREF 以及從 ICF 更改成 NOICF(所以,須要顯式指定 /OPT:REF 或 /OPT:ICF)。

有關 .PDB 和 .DBG 文件的更多信息,請參見知識庫文章 Q121366,INFO: PDB and DBG Files - What They Are and How They Work。 可在 MSDN 庫 或 http://search.support.microsoft.com 上找到知識庫文章。

沒法建立包含調試信息的 .exe 或 .dll。 調試信息始終放在 .pdb 文件中。

在 Visual Studio 開發環境中設置此連接器選項

  1. 打開項目的「屬性頁」對話框。 有關詳細信息,請參見設置 Visual C++ 項目屬性

  2. 單擊「連接器」文件夾。

  3. 單擊「調試」屬性頁。

  4. 修改「生成調試信息」屬性。

 

9./OPT(優化)


/OPT:{REF | NOREF} /OPT:{ICF[=iterations] | NOICF} /OPT:{LBR | NOLBR}
 
參數:
REF | NOREF

/OPT:REF 清除從未引用的函數和數據;/OPT:NOREF 保留從未引用的函數和數據。

當啓用 /OFT:REF 時,LINK 會移除未引用的已打包函數和數據。 若是對象已經用 /Gy 選項編譯過,它將包含打包的函數和數據 (COMDAT)。 此優化稱爲可傳遞的 COMDAT 消除。 默認狀況下,在非調試生成中啓用 /OPT:REF若要重寫此默認值並在程序中保留未引用的 COMDAT,請指定 /OPT:NOREF可使用 /INCLUDE 選項重寫特定符號的移除。

在顯式或默認啓用 /OPT:REF 後,將啓用受限形式的 /OPT:ICF(僅會摺疊相同的函數)。 若是須要 /OPT:REF 而不是 /OPT:ICF,則必須指定 /OPT:REF,NOICF/OPT:NOICF

若是指定了 /DEBUG,則 /OPT 的默認項是 NOREF,並且全部函數都保留在映像中。 若要重寫此默認項並優化調試生成,請指定 /OPT:REF因爲 /OPT:REF 隱式使用 /OPT:ICF,建議你同時指定 /OPT:NOICF 以在調試生成中保留相同的函數。 這樣更容易讀取堆棧跟蹤以及在本應摺疊在一塊兒的函數中設置斷點。 /OPT:REF 選項禁用增量連接。

你必須將 const 數據顯式標記爲 COMDAT;使用 __declspec(selectany)

指定 /OPT:ICF 不啓用 /OPT:REF 選項。

ICF[= iterations ] | NOICF

使用 /OPT:ICF[=iterations] 執行相同的 COMDAT 摺疊。 能夠從連接器輸出中刪除冗餘 COMDAT。 可選 iterations 參數指定遍歷符號以查找重複項的次數。 默認迭代次數是兩次。 附加的迭代能夠找到更多前一次迭代中未經過摺疊發現的重複項。

指定 /OPT:REF 而且 ICF 默認爲有效時的連接器行爲方式與顯式指定 /OPT:REF,ICF 時的行爲方式不一樣。 單獨使用 /OPT:REF 啓用的 ICF 的窗體不折疊只讀數據(包括 .rdata、.pdata 和 .xdata)。 所以,爲 x64 生成映像時將摺疊較少的函數,由於這些模塊中的函數更依賴於只讀數據(例如 .pdata 和 .xdata)。 若要獲取完整的 ICF 摺疊行爲,請顯式指定 /OPT:ICF

若要在 COMDAT 中放置函數,請使用 /Gy 編譯器選項;若要放置 const 數據,請將其聲明爲 __declspec(selectany)。 有關如何指定用於摺疊的數據的詳細信息,請參閱 selectany

默認狀況下,若是 REF 處於打開狀態,則 ICF 處於打開狀態。 若要重寫此默認值,當指定 REF 時,請使用 NOICF當未在調試生成中指定 /OPT:ICF 時,你必須顯式指定 /OPT:REF 以啓用 COMDAT 摺疊。 可是,因爲 /OPT:ICF 能合併相同的數據或函數,所以它也能更改顯示在堆棧跟蹤中的函數名。 它還能使你沒法在某些函數中設置斷點或在調試器中檢查某些數據,並讓你在單步執行代碼時進入意外的函數。 所以,建議不在調試生成中使用 /OPT:ICF,除非較小的代碼的好處能彌補這些不足。

說明 說明

因爲 /OPT:ICF 可使同一地址分配給不一樣的函數或只讀數據成員(使用 /Gy 編譯的 const 變量),所以它能中斷依賴於函數或只讀數據成員的惟一地址的程序。 有關詳細信息,請參閱 /Gy(啓用函數級連接)

LBR | NOLBR

/OPT:LBR/OPT:NOLBR 選項僅適用於 ARM 二進制文件。 因爲某些 ARM 處理器分支指令的範圍有限,所以若是連接器檢測到跳轉的地址超出範圍,它就會將分支指令的目標地址替換成包含指向實際目標的分支指令的代碼「島」的地址。 可以使用 /OPT:LBR 來優化對長分支指令的檢測和中間代碼島的佈局,以便最大程度減小整體代碼大小。 /OPT:NOLBR 指示連接器爲遇到的長分支指令生成代碼島,但不進行優化。

默認狀況下,增量連接未啓用時會設置 /OPT:LBR 選項。 若是須要非增量連接而不是長分支優化,請指定 /OPT:NOLBR /OPT:LBR 選項禁用增量連接。

 

優化一般是以增長連接時間爲代價,減少映像大小並加快程序速度。

你可以使用 /VERBOSE 選項查看由 /OPT:REF 移除的函數和由 /OPT:ICF 摺疊的函數。

在 Visual Studio 開發環境中設置 OPT:ICF 或 OPT:REF 連接器選項

  1. 打開項目的「屬性頁」對話框。 有關詳細信息,請參見使用項目屬性

  2. 在左窗格中,展開「配置屬性」、「連接器」和「優化」。

  3. 修改如下屬性之一:

    • 啓用 COMDAT 摺疊

    • 引用

在 Visual Studio 開發環境中設置 OPT:LBR 連接器選項

  1. 打開項目的「屬性頁」對話框。 有關詳細信息,請參見設置 Visual C++ 項目屬性

  2. 選擇 Linker 文件夾。

  3. 選擇「命令行」屬性頁。

  4. 在「附加選項」中輸入選項:

    /opt:lbr

這個太長。。。先不看
 

10./ALLOWBIND(禁止 DLL 綁定)


/ALLOWBIND[:NO]

/ALLOWBIND:NO 在 DLL 的標頭中設置一個位,向 Bind.exe 指示不容許綁定圖像。 若是 DLL 已經進行數字簽名(綁定使簽名無效),可能不須要綁定 DLL。

可使用 EDITBIN 實用工具的 /ALLOWBIND 選項編輯 /ALLOWBIND 功能的現有 DLL。

在 Visual Studio 開發環境中設置此連接器選項

  1. 打開項目的「屬性頁」對話框。 有關詳細信息,請參見使用項目屬性

  2. 依次展開「配置屬性」、「連接器」,而後選擇「命令行」。

  3. /ALLOWBIND:NO 輸入到「附加選項」中。

未完,待續。。。。。

 

番外:

 

1./DELAYSIGN(爲程序集進行部分簽名)

/DELAYSIGN[:NO]

若是隻想將公鑰放入程序集中,則應使用 /DELAYSIGN默認值爲 /DELAYSIGN:NO

若是不與 /KEYFILE/KEYCONTAINER 一塊兒使用,則 /DELAYSIGN 選項沒有任何做用。

若是要求徹底簽名的程序集,編譯器將對包含清單(程序集元數據)的文件進行散列處理,並用私鑰對該散列數據進行簽名。 產生的數字簽名存儲在包含清單的文件中。 若是程序集的簽名延遲,則連接器將不會計算和存儲簽名,但會在文件中保留空間以便之後添加簽名。

例如,使用 /DELAYSIGN 將容許測試人員把程序集放入全局緩存中。 測試完成後,能夠經過將私鑰放入程序集中對程序集進行徹底簽名。

有關對程序集簽名的更多信息,請參見 強名稱程序集(程序集簽名)(C++/CLI)延遲爲程序集簽名

其餘影響程序集生成的連接器選項爲:

在 Visual Studio 開發環境中設置此連接器選項

  1. 打開項目的「屬性頁」對話框。 有關詳細信息,請參見設置 Visual C++ 項目屬性

  2. 單擊「連接器」文件夾。

  3. 單擊「命令行」屬性頁。

  4. 將該選項鍵入「附加選項」框中。

涉及更多知識點,先押後待續。。。。。

 

2./DELAYLOAD(延遲加載導入)

/DELAYLOAD:dllname

/DELAYLOAD 選項致使 dllname 指定的 DLL 只能在程序第一次調用該 DLL 中的函數時加載。 有關詳細信息,請參閱 連接器的延遲加載 DLL 支持你能夠根據須要屢次使用此選項,以便指定已選的多個 DLL。 當連接你的程序時,你必須使用 Delayimp.lib,或者也能夠實現你本身的延遲加載 Helper 函數。

/DELAY 選項爲每一個延遲加載的 DLL 指定綁定和加載選項。

在 Visual Studio 開發環境中設置此連接器選項

  1. 打開項目的「屬性頁」對話框。 有關詳細信息,請參閱 使用項目屬性

  2. 在「連接器」文件夾中,選擇「輸入」屬性頁。

  3. 修改「延遲加載的 DLL」屬性。

涉及更多知識點,先押後待續。。。。。

3./DELAY(延遲加載導入設置)

/DELAY:UNLOAD
/DELAY:NOBIND

/DELAY 選項控制 DLL 的延遲加載

  • UNLOAD 限定符通知延遲加載 Helper 函數支持 DLL 的顯式卸載。 導入地址表 (IAT) 被重置爲其原始形式,從而使 IAT 指針無效並致使它們被覆蓋。

    若是不選擇 UNLOAD,任何對 FUnloadDelayLoadedDLL 調用都將失敗。

  • NOBIND 限定符通知連接器不要在最終圖像中包含可綁定的 IAT。 默認值是爲延遲加載的 DLL 建立可綁定的 IAT。 沒法靜態綁定生成的圖像。 (能夠在執行以前靜態綁定包含可綁定 IAT 的圖像。)請參閱 /BIND

    若是綁定了 DLL,則 Helper 函數將嘗試使用綁定信息,而不是對每一個引用的導入調用 GetProcAddress若是時間戳或首選地址與加載的 DLL 的時間戳或首選地址不匹配,則 Helper 函數將假定綁定的 IAT 已通過期並繼續執行,就像綁定的 IAT 不存在同樣。

    NOBIND 致使程序圖像比較大,可是能夠加快 DLL 的加載時間。 若是從不打算綁定 DLL,則 NOBIND 將禁止生成綁定的 IAT。

若要指定 DLL 延遲加載,請使用 /DELAYLOAD 選項。

在 Visual Studio 開發環境中設置此連接器選項

  1. 打開項目的「屬性頁」對話框。 有關信息,請參見使用項目屬性

  2. 依次展開「配置屬性」、「連接器」,而後選擇「高級」。

  3. 修改「延遲加載的 DLL」屬性。

相關文章
相關標籤/搜索