Upozornění linkerů LNK4210
oddíl oddíl oddílu existuje; mohou existovat neošetřené statické inicializátory nebo ukončovací moduly.
Poznámky
Některé kódy zavedly statické inicializátory nebo ukončovací moduly, ale spouštěcí kód knihovny VCRuntime nebo jeho ekvivalent (který potřebuje spustit statické inicializátory nebo ukončovací moduly), se při spuštění aplikace nespustí. Tady je několik příkladů kódu, který vyžaduje statické inicializátory nebo ukončovací moduly:
Globální proměnná třídy s konstruktorem, destruktoru nebo tabulkou virtuálních funkcí
Globální proměnná inicializovaná konstantou mimo kompilaci
Pokud chcete tento problém vyřešit, zkuste jeden z následujících postupů:
Odeberte veškerý kód se statickými inicializátory.
Nepoužívejte /NOENTRY. Po odebrání /NOENTRY může být také nutné odebrat /NODEFAULTLIB z příkazového řádku linkeru.
Pokud vaše sestavení používá /MT, přidejte do příkazového řádku linkeru libcmt.lib, libvcruntime.lib a libucrt.lib. Pokud vaše sestavení používá /MTd, přidejte knihovnu libcmtd.lib, vcruntimed.lib a libucrtd.lib.
Při přechodu z /clr:pure kompilace na /clr odeberte možnost /ENTRY z linker-line. To umožňuje inicializaci CRT a umožňuje spouštění statických inicializátorů při spuštění aplikace. Možnost /clr:pure compiler je v sadě Visual Studio 2015 zastaralá a v sadě Visual Studio 2017 není podporována.
Možnost kompilátoru /GS vyžaduje inicializaci __security_init_cookie
funkcí. Tato inicializace je poskytována ve výchozím nastavení v spouštěcím kódu knihovny VCRuntime, který běží v _DllMainCRTStartup
.
- Pokud je projekt sestaven pomocí /ENTRY a pokud /ENTRY předá jinou funkci než
_DllMainCRTStartup
, musí funkce volat_CRT_INIT
inicializaci CRT. Toto volání samotné není dostatečné, pokud knihovna DLL používá /GS, vyžaduje statické inicializátory nebo je volána v kontextu kódu MFC nebo ATL. Další informace najdete v tématu Knihovny DLL a chování knihovny runtime jazyka Visual C++.