.crt部分?这个警告意味着什么?

MGZ*_*ero 9 c++ msvcrt visual-studio-2010 critical-section static-initializer

我最近收到了这个警告(VC++ 2010)

warning LNK4210: .CRT section exists; there may be unhandled static initializers or terminators

我假设这是关键部分.我的操作系统课程已经有一段时间了,所以我无法弄清楚这意味着什么.如果我没记错的话,关键部分可以使用共享资源.那么这个警告是如何相关的呢?它究竟意味着什么?

Han*_*ant 9

不,CRT = C运行时间.它是任何程序完成工作所需的支持库.像strcpy()这样的东西住在那里.当代码包含需要在程序开始运行之前初始化的全局变量时,.obj文件中会出现'.CRT部分'.CRT负责这一点.

这没什么不寻常的.问题是链接器没有看到CRT链接到您的程序.除了初始化要求之外,你以某种方式编写了对CRT代码没有任何依赖性的代码.很奇怪,从来没有听说有人遇到这个问题.按照文档中的清单查看其中一个是否符合您的情况.

  • 如果要使用C ++构建内核驱动程序并尝试创建类的静态实例,则可能会遇到这种情况。没有CRT,就没有任何东西可以运行静态的初始化和终止代码。 (2认同)

Bri*_*lly 8

MSDN文档涵盖这还算不错:

一些代码引入了静态初始化器或终结器,但CRT或其等效物(需要运行静态初始化器或终结器)在应用程序启动时不会运行.导致此问题的代码示例:

  • 具有构造函数,析构函数或虚函数表的全局类变量.
  • 使用非编译时常量初始化的全局变量.

要解决此问题:

  • 将msvcrtxx.lib,libc.lib,libcd.lib,libcmt.lib或libcmtd.lib添加到链接器命令行,或者
  • 使用静态初始化程序删除所有代码.
  • 不要使用/ NOENTRY.

因此,我会检查您的代码,以了解最近添加的在静态或全局范围内创建的对象.如果您没有找到,则可能隐藏在您要链接的第三方库中.无论哪种方式,最可能的解决方案是使用上面"解决此问题"部分中的第一个建议与CRT链接.


Div*_*ran 5

警告LNK4210:存在.CRT节;可能有未处理的静态初始值设定项或终止符

此错误是由于在项目属性中指定了入口点引起的。

请按照以下步骤操作,看看您的错误是否已解决:

1.在解决方案资源管理器中右键单击您的项目(VS 2013)

2.转到属性-所有配置

3.链接器入口点。如果已指定入口点,则将其删除。

由于BOOST_TEST自动检测到入口点,因此无需指定入口点。

希望这也有助于解决其他反硝化错误。干杯!