我最近遇到了这个警告(VC++ 2010)
warning LNK4210: .CRT 部分存在;可能存在未处理的静态初始化程序或终止程序。
我认为这是临界区的问题。自从学习操作系统课程以来已经有一段时间了,所以我无法确定其确切含义。如果我没记错,临界区与共享资源有关。那么这个警告与什么相关,并且它确切意味着什么?
我最近遇到了这个警告(VC++ 2010)
warning LNK4210: .CRT 部分存在;可能存在未处理的静态初始化程序或终止程序。
我认为这是临界区的问题。自从学习操作系统课程以来已经有一段时间了,所以我无法确定其确切含义。如果我没记错,临界区与共享资源有关。那么这个警告与什么相关,并且它确切意味着什么?
不,CRT是C运行时。它是程序完成任务所需的支持库。像strcpy()这样的东西就在那里。当你的代码包含需要在程序开始运行之前初始化的全局变量时,你会在.obj文件中得到一个'.CRT'部分。CRT会处理这个。
这并不是什么不寻常的事情。问题是链接器没有看到CRT被链接到你的程序中。你以某种方式编写了没有任何依赖于CRT代码的代码,除了初始化要求之外。非常奇怪,从未听说过有人遇到此问题。请按照文档中的清单检查是否有符合您情况的条目。
警告 LNK4210: .CRT 部分已存在; 可能存在未处理的静态初始化器或终止程序
此错误是由于项目属性中指定入口点所引起的。
按照以下步骤尝试解决您的错误:
1.在解决方案资源管理器(VS 2013)中右键单击您的项目
2.转到属性-所有配置
3.链接器-入口点。如果已经指定了入口点,请删除它。
不需要指定入口点,因为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
,链接器将显示关于“warning LNK4210:.CRT 部分存在;可能存在未处理的静态初始化程序或终止程序”的警告。