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