链接器工具警告 LNK4210

section 节存在;可能有未处理的静态初始值设定项或终止符

备注

一些代码引入了静态初始值设定项或终止符,但 VCRuntime 库启动代码或其等效代码(需要运行静态初始值设定项或终止符)在应用程序启动时不会运行。 下面是一些需要静态初始值设定项或终止符的代码示例:

  • 具有构造函数、析构函数或虚函数表的全局类变量。

  • 使用非编译时常量初始化的全局变量。

要解决此问题,请尝试以下操作之一:

  • 删除包含静态初始值设定项的所有代码。

  • 请勿使用 /NOENTRY。 删除 /NOENTRY 后,可能还必须从链接器命令行中删除 /NODEFAULTLIB

  • 如果生成使用 /MT,请将 libcmt.lib, libvcruntime.lib 和 libucrt.lib 添加到链接器命令行。 如果生成使用 /MTd,请添加 libcmtd.lib、vcruntimed.lib 和 libucrtd.lib。

  • 从 /clr:pure 编译移动到 /clr 时,请从链接器行中删除 /ENTRY 选项。 这允许 CRT 初始化,并允许在应用程序启动时执行静态初始值设定项。 “/clr:pure”编译器选项在 Visual Studio 2015 中已弃用,在 Visual Studio 2017 中不受支持

/GS 编译器选项需要由 __security_init_cookie 函数初始化。 默认情况下,在 _DllMainCRTStartup 中运行的 VCRuntime 库启动代码中提供了此初始化。

  • 如果项目是使用 /ENTRY 生成的,并且如果 /ENTRY 传递了除 _DllMainCRTStartup 以外的函数,则该函数必须调用 _CRT_INIT 来初始化 CRT。 如果 DLL 使用 /GS、需要静态初始值设定项或在 MFC 或 ATL 代码的上下文中调用,则仅此调用是不够的。 有关详细信息,请参阅 DLL 和 Visual C++ 运行时库行为

另请参阅