Linkertoolwarnung LNK4221

Diese Objektdatei definiert keine zuvor nicht definierten öffentlichen Symbole, daher wird sie nicht von einem Verknüpfungsvorgang verwendet, der diese Bibliothek verwendet.

Berücksichtigen Sie die folgenden beiden Codeausschnitte: a.cpp

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

Und b.cpp:

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

Um die Dateien zu kompilieren und zwei Objektdateien zu erstellen, führen Sie cl /c a.cpp b.cpp an einer Eingabeaufforderung aus. Wenn Sie die Objektdateien durch Ausführen link /lib /out:test.lib a.obj b.objverknüpfen, erhalten Sie die LNK4221 Warnung. Wenn Sie die Objekte durch Ausführen link /lib /out:test.lib b.obj a.objverknüpfen, erhalten Sie keine Warnung.

Im zweiten Szenario wird keine Warnung ausgegeben, da der Linker in erster Linie (First In First Out, LIFO) arbeitet. Im ersten Szenario b.obj wird vor a.objund es a.obj werden keine neuen Symbole hinzugefügt. Indem Sie den Linker zuerst anweisen, den Vorgang zu verarbeiten a.obj , können Sie die Warnung vermeiden.

Eine häufige Ursache für diesen Fehler ist, wenn zwei Quelldateien die Option /Yc (Erstellen einer vorkompilierten Headerdatei) mit demselben Headerdateinamen angeben, der im Feld "Vorkompilierte Kopfzeile " angegeben ist. Eine häufige Ursache für dieses Problem betrifft pch.h , da standardmäßig pch.cpp neue Symbole enthalten pch.h und nicht hinzugefügt werden. Wenn eine andere Quelldatei mit pch.h/Yc und die zugeordnete .obj Datei bereits pch.objverarbeitet wird, löst der Linker LNK4221 aus.

Eine häufige Ursache für diesen Fehler ist, wenn zwei Quelldateien die Option /Yc (Erstellen einer vorkompilierten Headerdatei) mit demselben Headerdateinamen angeben, der im Feld "Vorkompilierte Kopfzeile " angegeben ist. Eine häufige Ursache für dieses Problem betrifft stdafx.h , da standardmäßig stdafx.cpp neue Symbole enthalten stdafx.h und nicht hinzugefügt werden. Wenn eine andere Quelldatei mit stdafx.h/Yc und die zugeordnete .obj Datei bereits stdafx.objverarbeitet wird, löst der Linker LNK4221 aus.

Eine Möglichkeit, dieses Problem zu beheben, besteht darin, sicherzustellen, dass für jeden vorkompilierten Header nur eine Quelldatei vorhanden ist, die /Yces enthält. Alle anderen Quelldateien müssen vorkompilierte Header verwenden. Weitere Informationen zum Ändern dieser Einstellung finden Sie unter /Yu (Verwenden der vorkompilierten Headerdatei).