連結器工具警告 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