共用方式為


連結器工具警告 LNK4217

'filename_1.obj' 中定義的符號 'symbol' 是由函式 'function' 中的 'filename_2.obj' 匯入

__declspec(dllimport) 已指定給符號,即使符號是在相同影像中的物件檔中定義也一樣。 __declspec(dllimport)拿掉修飾詞以解決此問題。

備註

symbol 是影像中定義的符號名稱。 function 是匯入符號的函式。

當您使用 /clr 選項進行編譯時,不會出現此警告。

如果您嘗試將兩個模組連結在一起,則也會發生LNK4217,相反地,您應該使用第一個模組的匯入連結庫編譯第二個模組。

// main.cpp
__declspec(dllimport) void func();

int main()
{
    func();
    return 0;
}

然後

// tt.cpp
// compile with: /c
void func() {}

嘗試編譯這兩個模組,如下所示,將會導致LNK4217:

cl.exe /c main.cpp tt.cpp
link.exe main.obj tt.obj

若要修正錯誤,請在編譯這兩個檔案之後,將tt.obj傳遞至 lib.exe 以建立 .lib 檔案,然後將main.obj與 tt.lib 連結,如下所示:

cl.exe /c main.cpp tt.cpp
lib.exe tt.obj /export:func /def
link.exe main.obj tt.lib

另請參閱

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