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.obj
a 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 /Yc
obsahuje . 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).