Sdílet prostřednictvím


Upozornění linkerů LNK4221

Tento soubor objektu nedefinuje žádné dříve nedefinované veřejné symboly, takže nebude používán žádnou operací propojení, která tuto knihovnu využívá.

Vezměte v úvahu následující dva fragmenty kódu: a.cpp

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

A b.cpp:

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

Chcete-li zkompilovat soubory a vytvořit dva soubory objektů, spusťte cl /c a.cpp b.cpp na příkazovém řádku. Pokud propojíte soubory objektů spuštěním link /lib /out:test.lib a.obj b.obj, zobrazí se upozornění LNK4221. Pokud objekty propojíte spuštěním link /lib /out:test.lib b.obj a.obj, nezobrazí se upozornění.

Ve druhém scénáři se nevystavuje žádné upozornění, protože linker funguje posledním způsobem typu first-out (LIFO). V prvním scénáři se b.obj zpracuje dříve a.obja a.obj neobsahuje žádné nové symboly, které by bylo možné přidat. Když dáte linkeru pokyn, aby nejprve zpracovával a.obj , můžete se upozornění vyhnout.

Běžnou příčinou této chyby je, že dva zdrojové soubory určují možnost /Yc (Vytvořit předkompilovaný hlavičkový soubor) se stejným názvem souboru hlaviček zadaným v poli Předkompilovaná hlavička . Běžnou příčinou tohoto problému pch.h je, že ve výchozím nastavení pch.cpp obsahuje pch.h a nepřidává žádné nové symboly. Pokud jiný zdrojový soubor obsahuje pch.h /Yc a přidružený .obj soubor je zpracován před pch.obj, linker vyvolá LNK4221.

Běžnou příčinou této chyby je, že dva zdrojové soubory určují možnost /Yc (Vytvořit předkompilovaný hlavičkový soubor) se stejným názvem souboru hlaviček zadaným v poli Předkompilovaná hlavička . Běžnou příčinou tohoto problému stdafx.h je, že ve výchozím nastavení stdafx.cpp obsahuje stdafx.h a nepřidává žádné nové symboly. Pokud jiný zdrojový soubor obsahuje stdafx.h /Yc a přidružený .obj soubor je zpracován před stdafx.obj, linker vyvolá LNK4221.

Jedním ze způsobů, jak tento problém vyřešit, je zajistit, aby pro každou předkompilovanou hlavičku existuje pouze jeden zdrojový soubor, který ho /Ycobsahuje . Všechny ostatní zdrojové soubory musí používat předkompilované hlavičky. Další informace o tom, jak toto nastavení změnit, najdete v tématu /Yu (Použití předkompilovaného hlavičkového souboru).