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

时间:2011-06-30 01:11:05

标签: c++ visual-studio-2010 msvcrt critical-section static-initializer

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

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

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

6 个答案:

答案 0 :(得分:8)

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

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

答案 1 :(得分:7)

MSDN docs很好地说明了这一点:

  

一些代码引入了静态   初始化器或终结器,但是   CRT或其等价物(需要   运行静态初始化器或   当终止者没有运行时   申请开始。代码示例   这会导致这个:

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

解决此问题:

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

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

答案 2 :(得分:3)

警告LNK4210:.CRT部分存在;可能存在未处理的静态初始化器或终结器

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

按照以下步骤查看您的错误是否已解决:

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

2.转到属性 - 所有配置

3.Linker-入口点。如果已指定,则删除入口点。

当BOOST_TEST自动检测到入口点时,无需指定入口点。

希望这也有助于其他无限制错误。干杯!

答案 3 :(得分:1)

我通过手动指定DLL的“自定义”条目遇到了同样的问题。我删除了那个自定义DLL条目,我只是使用默认名称DLLMain,它再次工作......奇怪。

答案 4 :(得分:0)

LIBCMT.LIB 初始化 CRT 相关的东西.... 使用 mainCRTStartup 作为入口函数,然后显式调用 _CRT_INIT。

链接hello_world.obj Kernel32.lib UCRT.LIB legacy_stdio_definitions.lib LIBCMT.LIB /subsystem:console /out:hello_world_basic.exe

答案 5 :(得分:0)

 
 
bits 64
default rel

segment .data
    msg db "Hello world!", 0xd, 0xa, 0

segment .text
global mainCRTStartup
extern ExitProcess
extern _CRT_INIT

extern printf

mainCRTStartup:
    push    rbp
    mov     rbp, rsp
    sub     rsp, 32

    call    _CRT_INIT

    lea     rcx, [msg]
    call    printf

    xor     rax, rax
    call    ExitProcess
    ret
 

如果你不调用_CRT_INIT,链接将显示关于“warning LNK4210: .CRT section exists; there may be unhandled static initializers or terminators”的警告