我最近收到了这个警告(VC ++ 2010)
warning LNK4210: .CRT section exists; there may be unhandled static initializers or terminators
我假设这是关键部分。我的操作系统课程已经有一段时间了,所以我无法弄清楚这意味着什么。如果我没记错的话,关键部分可以使用共享资源。那么这个警告是如何相关的呢?它究竟意味着什么呢?
答案 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”的警告