#pragma comment 使用

編寫程序的時候,我們常用到#pragma指令來設定編譯器的狀態或者是指示編譯器完成一些特定的動作。

#pragma once :

這是一個比較常用的指令,只要在頭文件的最開始加入這條指令就能夠保證頭文件被編譯一次,避免文件被重複包含。

 

#pragma comment :
該 指令的格式:

#pragma comment( comment-type [,"commentstring"] )
該指令將一個註釋記錄放入一個對象文件或可執行文件中。
       comment-type(註釋類型):可以指定爲五種預定義的標識符的其中一種。

commentstring是一個提供爲comment-type提供附加信息的字符串,


五種預定義的標識符爲:

1、compiler:

    將編譯器的版本號和名稱放入目標文件中,本條註釋記錄將被編譯器忽略。
    如果你爲該記錄類型提供了commentstring參數,編譯器將會產生一個警告。 
    例如:#pragma comment( compiler )

 

2、exestr:

    將commentstring參數放入目標文件中,在鏈接的時候這個字符串將被放入到可執行文件中。
    當操作系統加載可執行文件的時候,該參數字符串不會被加載到內存中.但是,該字符串可以被dumpbin之類的程序查找出並打印出來,你可以用這個標識符將版本號碼之類的信息嵌入到可執行文件中!

 

3、lib:

    這是一個非常常用的關鍵字,用來將一個庫文件鏈接到目標文件中。

    常用的lib關鍵字,可以幫我們連入一個庫文件。 
    例如: #pragma comment(lib, "user32.lib") 
            該指令用來將user32.lib庫文件加入到本工程中。


4、linker:

    將一個鏈接選項放入目標文件中,你可以使用這個指令來代替由命令行傳入的或者在開發環境中設置的鏈接選項,你可以指定/include選項來強制包含某個對象。

    例如: 
#pragma comment(linker, "/include:__mySymbol")

    你可以在程序中設置下列鏈接選項  

                /DEFAULTLIB

  • /EXPORT

  • /INCLUDE

  • /MANIFESTDEPENDENCY

  • /MERGE

  • /SECTION

(1)/DEFAULTLIB:library

/DEFAULTLIB 選項將一個 library 添加到 LINK 在解析引用時搜索的庫列表。用 /DEFAULTLIB指定的庫在命令行上指定的庫之後和 .obj 文件中指定的默認庫之前被搜索。

忽略所有默認庫 (/NODEFAULTLIB) 選項重寫 /DEFAULTLIB:library。如果在兩者中指定了相同的 library 名稱,忽略庫 (/NODEFAULTLIB:library) 選項將重寫 /DEFAULTLIB:library。

(2)/EXPORT:entryname[,@ordinal[,NONAME]][,DATA]

使用該選項,可以從程序導出函數,以便其他程序可以調用該函數。也可以導出數據。通常在 DLL 中定義導出。entryname 是調用程序要使用的函數或數據項的名稱。ordinal 在導出表中指定範圍在 1 至 65,535 的索引;如果沒有指定 ordinal,則 LINK 將分配一個。NONAME 關鍵字只將函數導出爲序號,沒有 entryname。

DATA 關鍵字指定導出項爲數據項。客戶程序中的數據項必須用 extern __declspec(dllimport) 來聲明。

有三種導出定義的方法,按照建議的使用順序依次爲:

  1. 源代碼中的 __declspec(dllexport)

  2. .def 文件中的 EXPORTS 語句

  3. LINK 命令中的 /EXPORT 規範

所有這三種方法可以用在同一個程序中。LINK 在生成包含導出的程序時還創建導入庫,除非生成中使用了 .exp 文件。

LINK 使用標識符的修飾形式。編譯器在創建 .obj 文件時修飾標識符。如果 entryname 以其未修飾的形式指定給鏈接器(與其在源代碼中一樣),則 LINK 將試圖匹配該名稱。如果無法找到唯一的匹配名稱,則 LINK 發出錯誤信息。當需要將標識符指定給鏈接器時,請使用 Dumpbin 工具獲取該標識符的修飾名形式。

(3)/INCLUDE:symbol

/INCLUDE 選項通知鏈接器將指定的符號添加到符號表。

若要指定多個符號,請在符號名稱之間鍵入逗號 (,)、分號 (;) 或空格。在命令行上,對每個符號指定一次 /INCLUDE:symbol。

鏈接器通過將包含符號定義的對象添加到程序來解析 symbol。該功能對於添包含不會鏈接到程序的庫對象非常有用。用該選項指定符號將通過 /OPT:REF 重寫該符號的移除。

我們經常用到的是#pragma   comment(lib,"*.lib")這類的。

#pragma   comment(lib,"Ws2_32.lib")表示鏈接Ws2_32.lib這個庫。  

和在工程設置裏寫上鍊入Ws2_32.lib的效果一樣 

5、user:

    將一般的註釋信息放入目標文件中,commentstring參數包含註釋的文本信息,這個註釋記錄將被鏈接器忽略。 
    例如: 
#pragma comment( user, "Compiled on " __DATE__ " at " __TIME__ )

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