我最近收到了这个警告(VC++ 2010)
warning LNK4210: .CRT section exists; there may be unhandled static initializers or terminators
我假设这是关键部分。自从我的操作系统课程以来已经有一段时间了,所以我无法真正弄清楚这意味着什么。如果我没记错的话,关键部分使用共享资源。那么这个警告是如何相关的,它到底是什么意思呢?
我最近收到了这个警告(VC++ 2010)
warning LNK4210: .CRT section exists; there may be unhandled static initializers or terminators
我假设这是关键部分。自从我的操作系统课程以来已经有一段时间了,所以我无法真正弄清楚这意味着什么。如果我没记错的话,关键部分使用共享资源。那么这个警告是如何相关的,它到底是什么意思呢?
不,CRT = C 运行时间。它是任何程序完成工作所需的支持库。像 strcpy() 这样的东西就住在那里。当您的代码包含需要在程序开始运行之前初始化的全局变量时,您会在 .obj 文件中获得一个“.CRT 部分”。CRT 会处理这个问题。
这没什么不寻常的。问题是链接器没有看到 CRT 链接到您的程序中。您以某种方式编写了对 CRT 代码没有任何依赖关系的代码,除了初始化要求。很奇怪,没听说有人有这个问题。按照文档中的清单查看其中一项是否符合您的情况。
MSDN 文档很好地涵盖了这一点:
一些代码引入了静态初始化程序或终止符,但 CRT 或其等效项(需要运行静态初始化程序或终止符)在应用程序启动时不运行。导致这种情况的代码示例:
- 具有构造函数、析构函数或虚函数表的全局类变量。
- 使用非编译时常量初始化的全局变量。
要解决此问题:
- 将 msvcrtxx.lib、libc.lib、libcd.lib、libcmt.lib 或 libcmtd.lib 添加到链接器命令行,或者
- 删除所有带有静态初始化程序的代码。
- 不要使用 /NOENTRY。
因此,我会检查您的代码,以了解最近添加的在静态或全局范围内创建的对象。如果您没有找到,它们可能隐藏在您链接的第 3 方库中。无论哪种方式,最可能的解决方案是使用上面“解决此问题”部分中的第一个建议与 CRT 链接。
警告 LNK4210:.CRT 部分存在;可能有未处理的静态初始化器或终止器
此错误是由于在项目属性中指定了入口点造成的。
请按照以下步骤操作,看看您的错误是否得到解决:
1.在解决方案资源管理器中右键单击您的项目(VS 2013)
2.转到属性-所有配置
3.Linker-入口点。如果您指定了任何入口点,请删除该入口点。
不需要指定入口点,因为 BOOST_TEST 会自动检测入口点。
希望这也有助于其他初始化程序错误。干杯!
通过手动为我的 DLL 指定“自定义”条目,我遇到了同样的问题。我删除了那个自定义 DLL 条目,只是使用默认名称 DLLMain 并且它再次工作......奇怪。
LIBCMT.LIB 初始化 CRT 相关的东西.... 使用 mainCRTStartup 作为入口函数,然后显式调用 _CRT_INIT。
link hello_world.obj Kernel32.lib UCRT.LIB legacy_stdio_definitions.lib LIBCMT.LIB /subsystem:console /out:hello_world_basic.exe
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
,链接器将显示有关“警告 LNK4210:.CRT 部分存在;可能存在未处理的静态初始化程序或终止符”的警告。