次の方法で共有


リンカー ツールの警告 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

関連項目

リンカー ツールの警告 LNK4049
リンカー ツールの警告 LNK4286
dllexport、dllimport