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.obj
verknüpfen, erhalten Sie die LNK4221 Warnung. Wenn Sie die Objekte durch Ausführen link /lib /out:test.lib b.obj a.obj
verknü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.obj
und 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.obj
verarbeitet 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.obj
verarbeitet 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 /Yc
es enthält. Alle anderen Quelldateien müssen vorkompilierte Header verwenden. Weitere Informationen zum Ändern dieser Einstellung finden Sie unter /Yu
(Verwenden der vorkompilierten Headerdatei).
Feedback
https://aka.ms/ContentUserFeedback.
Bald verfügbar: Im Laufe des Jahres 2024 werden wir GitHub-Issues stufenweise als Feedbackmechanismus für Inhalte abbauen und durch ein neues Feedbacksystem ersetzen. Weitere Informationen finden Sie unterFeedback senden und anzeigen für