リンカー ツールの警告 LNK4221

このオブジェクト ファイルは、以前に未定義であったパブリック シンボルを定義していないため、このライブラリを使用するリンク操作では使用されません

次の 2 つのコード スニペットについて考えてみます a.cpp

// a.cpp
#include <atlbase.h>

および b.cpp:

// b.cpp
#include <atlbase.h>
int function()
{
   return 0;
}

ファイルをコンパイルし、2 つのオブジェクト ファイルを作成するには、コマンド プロンプトで実行 cl /c a.cpp b.cpp します。 実行 link /lib /out:test.lib a.obj b.objしてオブジェクト ファイルをリンクすると、LNK4221 警告が表示されます。 実行 link /lib /out:test.lib b.obj a.objしてオブジェクトをリンクすると、警告は表示されません。

リンカーは後入れ先出し (LIFO) 方式で動作するため、2 番目のシナリオでは警告は発生しません。 最初のシナリオでは、前にa.obj処理されa.objb.obj追加する新しいシンボルはありません。 リンカーに最初に処理 a.obj するように指示することで、警告を回避できます。

このエラーの一般的な原因は、2 つのソース ファイルで、プリコンパイル済みヘッダー フィールドに指定された同じヘッダー ファイル名を持つオプション/Yc (プリコンパイル済みヘッダー ファイルの作成) を指定する場合です。 この問題の一般的な原因はpch.h、既定では新しいシンボルが含まれておりpch.hpch.cpp追加されないためです。 別のソース ファイルが含まれておりpch.h、関連付けられている.objファイルが処理される前にpch.obj、リンカーは LNK4221 をスロー/Ycします。

このエラーの一般的な原因は、2 つのソース ファイルで、プリコンパイル済みヘッダー フィールドに指定された同じヘッダー ファイル名を持つオプション/Yc (プリコンパイル済みヘッダー ファイルの作成) を指定する場合です。 この問題の一般的な原因はstdafx.h、既定では新しいシンボルが含まれておりstdafx.hstdafx.cpp追加されないためです。 別のソース ファイルが含まれておりstdafx.h、関連付けられている.objファイルが処理される前にstdafx.obj、リンカーは LNK4221 をスロー/Ycします。

この問題を解決する 1 つの方法は、プリコンパイル済みヘッダーごとに、それを含む /Ycソース ファイルが 1 つだけであることを確認することです。 他のすべてのソース ファイルでは、プリコンパイル済みヘッダーを使用する必要があります。 この設定を変更する方法の詳細については、「(プリコンパイル済みヘッダー ファイルを使用する)」を参照してください/Yu