Sdílet prostřednictvím


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++.

Viz také