Delen via


Waarschuwing LNK4221 voor Linker Tools

Dit objectbestand definieert geen eerder niet-gedefinieerde openbare symbolen, dus het wordt niet gebruikt door een koppelingsbewerking die deze bibliotheek verbruikt

Example

Houd rekening met de volgende twee codefragmenten: a.cpp

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

En b.cpp:

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

Als u de bestanden wilt compileren en twee objectbestanden wilt maken, voert u de opdrachtprompt cl /c a.cpp b.cpp uit. Als u de objectbestanden koppelt door deze uit te voeren link /lib /out:test.lib a.obj b.obj, ontvangt u de waarschuwing LNK4221. Als u de objecten koppelt door deze uit te voeren link /lib /out:test.lib b.obj a.obj, ontvangt u geen waarschuwing.

Er wordt in het tweede scenario geen waarschuwing gegeven omdat de linker op een laatste in, eerst uit (LIFO) manier werkt. In het eerste scenario wordt b.obj verwerkt voordat a.obj, en er worden geen nieuwe symbolen toegevoegd aan a.obj. Door de linker eerst te laten verwerken a.obj , kunt u de waarschuwing vermijden.

Een veelvoorkomende oorzaak van deze fout is wanneer twee bronbestanden de optie /Yc (Vooraf gecompileerd headerbestand maken) opgeven met dezelfde headerbestandsnaam die is opgegeven in het veld Vooraf gecompileerde header . Een veelvoorkomende oorzaak van dit probleem houdt verband met pch.h, omdat pch.cpp standaard pch.h bevat en geen nieuwe symbolen toevoegt. Als een ander bronbestand pch.h en /Yc bevat en het bijbehorende .obj bestand wordt verwerkt voordat pch.obj, genereert de linker LNK4221.

Een veelvoorkomende oorzaak van deze fout is wanneer twee bronbestanden de optie /Yc (Vooraf gecompileerd headerbestand maken) opgeven met dezelfde headerbestandsnaam die is opgegeven in het veld Vooraf gecompileerde header . Een veelvoorkomende oorzaak van dit probleem heeft te maken met stdafx.h, omdat stdafx.cpp standaard stdafx.h opneemt en geen nieuwe symbolen toevoegt. Als een ander bronbestand stdafx.h met /Yc bevat en het bijbehorende .obj-bestand wordt vóór stdafx.obj verwerkt, genereert de linker LNK4221.

Een manier om dit probleem op te lossen is ervoor te zorgen dat er voor elke vooraf gecompileerde header slechts één bronbestand is dat het bevat./Yc Alle andere bronbestanden moeten vooraf gecompileerde headers gebruiken. Zie (Vooraf gecompileerd headerbestand gebruiken) voor meer informatie over het wijzigen van deze instelling/Yu.