リンカー ツールの警告 LNK4217
'filename_1.obj' で定義されたシンボル 'symbol' は、関数 'function' で 'filename_2.obj' によってインポートされています
同一イメージ内のオブジェクト ファイルでシンボルが定義されているにもかかわらず、__declspec(dllimport) がシンボルに指定されました。 この警告を解決するには、 __declspec(dllimport)
修飾子を削除します。
解説
symbol は、イメージ内で定義されているシンボル名です。 function は、シンボルをインポートする関数です。
この警告は、/clr オプションを使用してコンパイルした場合には表示されません。
LNK4217 は、2 つのモジュールをリンクしようとした場合にも発生する可能性があります。その場合は、代わりに、最初のモジュールのインポート ライブラリを使用して 2 番目のモジュールをコンパイルする必要があります。
// main.cpp
__declspec(dllimport) void func();
int main()
{
func();
return 0;
}
そして、
// tt.cpp
// compile with: /c
void func() {}
次に示すように、これら 2 つのモジュールをコンパイルしようとすると、LNK4217 が発生します。
cl.exe /c main.cpp tt.cpp
link.exe main.obj tt.obj
このエラーを解決するには、次に示すように、2 つのファイルをコンパイルした後、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