連結器工具警告 LNK4049
匯入 『filename.obj』 中定義的符號 『symbol』
__declspec(dllimport) 已針對 符號 指定,即使符號是在相同影像中的物件檔 中定義filename.obj 。 __declspec(dllimport)
拿掉修飾詞以解決此問題。
備註
當您在一個物件檔案中定義符號,並使用另一個對象檔中的宣告修飾詞來參考它 __declspec(dllimport)
時,鏈接器會產生這個警告。
警告LNK4049是連結器工具警告LNK4217的較一般版本。 當連結器無法判斷參考匯入符號的函式或對象檔時,連結器會產生警告LNK4049。
產生LNK4049而不是LNK4217的常見案例如下:
使用 /INCREMENTAL 選項時。
使用 /LTCG 選項時。
若要解決LNK4049,請嘗試下列其中一個程式:
__declspec(dllimport)
從觸發LNK4049之符號的正向宣告中移除 修飾詞。 您可以使用 DUMPBIN 公用程式來搜尋二進位影像內的符號。 DUMPBIN /SYMBOLS 參數會顯示影像的 COFF 符號數據表。 如需 DUMPBIN 公用程式的詳細資訊,請參閱 DUMPBIN 參考。暫時停用累加連結和整個程序優化。 重新編譯時,應用程式會產生 Warning LNK4217,其中包含參考匯入符號的函式名稱。
__declspec(dllimport)
從匯入的符號中移除宣告修飾詞,並視需要重新啟用累加連結或整個程序優化。
雖然最終產生的程式代碼行為正確,但呼叫匯入函式所產生的程式代碼比直接呼叫函式更有效率。 當您使用 /clr 選項進行編譯時,不會出現此警告。
如需匯入和匯出數據宣告的詳細資訊,請參閱 dllexport、dllimport。
範例
連結下列兩個模組會產生LNK4049。 第一個模組會產生包含單一導出函式的物件檔案。
// LNK4049a.cpp
// compile with: /c
__declspec(dllexport) int func()
{
return 3;
}
第二個模組會產生物件檔,其中包含第一個模組中匯出之函式的轉送宣告,以及對函式內部此函式的 main
呼叫。 將此模組與第一個模組連結會產生LNK4049。 __declspec(dllimport)
從宣告中移除 修飾詞,以解析警告。
// LNK4049b.cpp
// compile with: /link /WX /LTCG LNK4049a.obj
// LNK4049 expected
__declspec(dllimport) int func();
// try the following line instead
// int func();
int main()
{
return func();
}