共用方式為


連結器工具警告 LNK4049

'filename.obj ' 中定義的符號 ' symbol ' 已匯入

__declspec(dllimport) 已針對 符號 指定,即使符號定義于相同影像中的物件檔 filename.obj 中也一樣。 __declspec(dllimport)移除修飾詞以解決此問題。

備註

當您在一個物件檔案中定義符號,並使用另一個物件檔中的宣告修飾詞來參考它 __declspec(dllimport) 時,連結器會產生這個警告。

警告LNK4049是連結器工具警告LNK4217 的較一般版本 。 當連結器無法判斷參考匯入符號的函式或物件檔時,連結器會產生警告LNK4049。

產生LNK4049而不是LNK4217的常見案例如下:

若要解決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();
}

另請參閱

連結器工具警告 LNK4217
連結器工具警告 LNK4286
dllexport、dllimport