リンカー ツールの警告 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.obj
、b.obj
追加する新しいシンボルはありません。 最初に処理 a.obj
するようにリンカーに指示することで、警告を回避できます。
このエラーの一般的な原因は、2 つのソース ファイルで、プリコンパイル済みヘッダー フィールドに指定されたヘッダー ファイル名が同じオプション /Yc
(プリコンパイル済みヘッダー ファイルの作成) を指定した場合です。 この問題pch.h
の一般的な原因は、既定では新しいシンボルが含まれておりpch.h
、pch.cpp
追加されないためです。 別のソース ファイルが含/Yc
まれておりpch.h
、関連付けられている.obj
ファイルが前にpch.obj
処理された場合、リンカーはLNK4221をスローします。
このエラーの一般的な原因は、2 つのソース ファイルで、プリコンパイル済みヘッダー フィールドに指定されたヘッダー ファイル名が同じオプション /Yc
(プリコンパイル済みヘッダー ファイルの作成) を指定した場合です。 この問題stdafx.h
の一般的な原因は、既定では新しいシンボルが含まれておりstdafx.h
、stdafx.cpp
追加されないためです。 別のソース ファイルが含/Yc
まれておりstdafx.h
、関連付けられている.obj
ファイルが前にstdafx.obj
処理された場合、リンカーはLNK4221をスローします。
この問題を解決する 1 つの方法は、プリコンパイル済みヘッダーごとに、それを /Yc
含むソース ファイルが 1 つだけであることを確認することです。 他のすべてのソース ファイルでは、プリコンパイル済みヘッダーを使用する必要があります。 この設定を変更する方法の詳細については、「(プリコンパイル済みヘッダー ファイルを使用する)」を参照してください。/Yu