Dela via


Varning LNK4221 för länkverktyg

Den här objektfilen definierar inte tidigare odefinierade offentliga symboler, så den kommer inte att användas av någon länkåtgärd som använder det här biblioteket

Example

Överväg följande två kodfragment: a.cpp

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

Och b.cpp:

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

Om du vill kompilera filerna och skapa två objektfiler kör du cl /c a.cpp b.cpp i en kommandotolk. Om du länkar objektfilerna genom att köra link /lib /out:test.lib a.obj b.objfår du LNK4221 varning. Om du länkar objekten genom att köra link /lib /out:test.lib b.obj a.objfår du ingen varning.

Ingen varning utfärdas i det andra scenariot eftersom länkaren fungerar på ett sist in, först ut-sätt (LIFO). I det första scenariot b.obj bearbetas före a.objoch a.obj har inga nya symboler att lägga till. Genom att instruera länkaren att bearbeta a.obj först kan du undvika varningen.

En vanlig orsak till det här felet är när två källfiler anger alternativet /Yc (Skapa fördefinierad rubrikfil) med samma rubrikfilnamn som anges i fältet Förkompilerat huvud . En vanlig orsak till det här problemet handlar om pch.h eftersom det som standard pch.cpp innehåller pch.h och inte lägger till några nya symboler. Om en annan källfil innehåller pch.h med /Yc och den associerade .obj-filen bearbetas före pch.obj, genererar länkaren LNK4221.

En vanlig orsak till det här felet är när två källfiler anger alternativet /Yc (Skapa fördefinierad rubrikfil) med samma rubrikfilnamn som anges i fältet Förkompilerat huvud . En vanlig orsak till det här problemet handlar om stdafx.h eftersom det som standard stdafx.cpp innehåller stdafx.h och inte lägger till några nya symboler. Om en annan källfil innehåller stdafx.h med /Yc och den associerade .obj filen bearbetas före stdafx.obj, genererar länkaren LNK4221.

Ett sätt att lösa det här problemet är att se till att för varje fördefinierad rubrik finns det bara en källfil som innehåller den med /Yc. Alla andra källfiler måste använda förkompilerade rubriker. Mer information om hur du ändrar den här inställningen /Yu finns i (Använd fördefinierad rubrikfil).