#pragma comment( comment-type [,"commentstring"] )
該宏放置一個注釋到對象檔案或者可執行檔。
comment-type是一個預定義的標識符,指定注釋的類型,應該是compiler,exestr,lib,linker之一。
commentstring是一個提供為comment-type提供附加資訊的字串,
Remarks:
1、compiler:放置編譯器的版本或者名字到一個對象檔案,該選項是被linker忽略的。
2、exestr:在以後的版本將被取消。
3、lib:放置一個庫搜尋記錄到對象檔案中,這個類型應該是和commentstring(指定你要Liner搜尋的lib的名稱和路徑)
這個庫的名字放在Object檔案的預設庫搜尋記錄的後面,linker搜尋這個這個庫就像你在命令列輸入這個命令一樣。你可以
在一個源檔案中設定多個庫記錄,它們在object檔案中的順序和在源檔案中的順序一樣。如果預設庫和附加庫的次序是需要
區別的,使用Z編譯開關是防止預設庫放到object模組。
4、linker:指定一個串連選項,這樣就不用在命令列輸入或者在開發環境中設定了。
只有下面的linker選項能被傳給Linker.
/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) 來聲明。
有三種匯出定義的方法,按照建議的使用順序依次為:
原始碼中的 __declspec(dllexport)
.def 檔案中的 EXPORTS 語句
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的效果一樣,不過這種方法寫的
程式別人在使用你的代碼的時候就不用再設定工程settings了
#pragma comment(linker,"/SECTION:flag_data,RWS")
可以共用資料在動態連結程式庫中的資料,或者可以用來是應用程式只啟動一次,注意,flag_data與RWS之間不能有空格!!