.crt节是什么?这个警告有什么意义?

11

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

warning LNK4210: .CRT 部分存在;可能存在未处理的静态初始化程序或终止程序。

我认为这是临界区的问题。自从学习操作系统课程以来已经有一段时间了,所以我无法确定其确切含义。如果我没记错,临界区与共享资源有关。那么这个警告与什么相关,并且它确切意味着什么?

6个回答

11

不,CRT是C运行时。它是程序完成任务所需的支持库。像strcpy()这样的东西就在那里。当你的代码包含需要在程序开始运行之前初始化的全局变量时,你会在.obj文件中得到一个'.CRT'部分。CRT会处理这个。

这并不是什么不寻常的事情。问题是链接器没有看到CRT被链接到你的程序中。你以某种方式编写了没有任何依赖于CRT代码的代码,除了初始化要求之外。非常奇怪,从未听说过有人遇到此问题。请按照文档中的清单检查是否有符合您情况的条目。


1
好的,很酷,我会浏览一下那个清单。虽然没有给我带来任何问题,但我想要一个无警告编译 :) - MGZero
1
值得一提的是,有些人故意编写“真正”的微型程序(通过私有字节RAM使用情况)- 至少考虑到“32位Windows进程”的要求。当您意外地使用依赖于CRT的语言功能时,就会出现警告。 - Roman Starkov
5
如果你在使用C++构建内核驱动程序并尝试创建一个类的静态实例,就可能遇到这个问题。没有CRT(C运行时库),就没有运行静态初始化和终止代码的途径。 - Dave Ruske

8
MSDN文档对此有很好的介绍:
一些代码引入了静态初始化程序或终止程序,但CRT或其等效物(需要运行静态初始化程序或终止程序)在应用程序启动时未运行。会导致此问题的代码示例包括:
- 具有构造函数、析构函数或虚函数表的全局类变量。 - 用非编译时常量初始化的全局变量。
要解决此问题:
- 将msvcrtxx.lib、libc.lib、libcd.lib、libcmt.lib或libcmtd.lib添加到链接器命令行中,或 - 删除所有具有静态初始化程序的代码。 - 不要使用/NOENTRY。
因此,建议检查您的代码是否最近添加了在静态或全局范围内创建的对象。如果没有找到任何问题,则可能隐藏在您正在链接的第三方库中。无论哪种情况,最可能的解决方案是使用上述“要解决此问题”部分中的第一个建议链接CRT。

1
如果您正在为使用不同CRT(例如Citrix Receiver)编译的产品编写插件,则可能无法始终使用MSVCRT。如果一个进程将多个版本的CRT拉入其进程中,可能会发生一些不好的事情。仔细编码将允许您删除CRT。 - birdwes

6

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

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

按照以下步骤尝试解决您的错误:

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

2.转到属性-所有配置

3.链接器-入口点。如果已经指定了入口点,请删除它。

不需要指定入口点,因为BOOST_TEST会自动检测入口点。

希望这对于其他初始化器错误也有帮助。干杯!


2

我曾经遇到过同样的问题,通过手动指定一个“自定义”条目到我的DLL中。我删除了该自定义DLL条目,现在只是使用默认名称DLLMain,问题得到解决...奇怪。


-1

使用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 

-2
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 部分存在;可能存在未处理的静态初始化程序或终止程序”的警告。

1
这个问题是关于C++,而不是汇编语言。 - kuroi neko

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接