C++:“mainCRTStartup”错误等的多重定义

Posted

技术标签:

【中文标题】C++:“mainCRTStartup”错误等的多重定义【英文标题】:C++ : multiple definition of `mainCRTStartup' error etc 【发布时间】:2014-10-16 20:07:23 【问题描述】:

所以我对 c++ 还很陌生,我已经用代码块编写了这个程序:

#include<iostream>

using namespace std;

int main()

    cout << "Hello World!" << endl;
    return 0;

当我构建它并运行它时,我得到一个错误。这是构建日志:

-------------- Build: Debug in HelloWorld (compiler: GNU GCC Compiler)---------------

mingw32-g++.exe  -o bin\Debug\CPP_1.exe obj\Debug\main.o   
obj\Debug\main.o:crt1.c:(.text+0x280): multiple definition of `mainCRTStartup'
c:/programfiles(x86)/codeblocks/mingw/bin/../lib/gcc/mingw32/4.7.1/../../../crt2.o:crt1.c:(.text+0x280): first defined here
obj\Debug\main.o:crt1.c:(.text+0x2a0): multiple definition of `WinMainCRTStartup'
c:/program files (x86)/codeblocks/mingw/bin/../lib/gcc/mingw32/4.7.1/../../../crt2.o:crt1.c:(.text+0x2a0): first defined here
obj\Debug\main.o:crt1.c:(.text+0x2c0): multiple definition of `atexit'
c:/program files (x86)/codeblocks/mingw/bin/../lib/gcc/mingw32/4.7.1/../../../crt2.o:crt1.c:(.text+0x2c0): first defined here
obj\Debug\main.o:crt1.c:(.text+0x2d0): multiple definition of `_onexit'
c:/program files (x86)/codeblocks/mingw/bin/../lib/gcc/mingw32/4.7.1/../../../crt2.o:crt1.c:(.text+0x2d0): first defined here
obj\Debug\main.o:cygming-crtbegin.c:(.text+0x2e0): multiple definition of `__gcc_register_frame'
c:/program files (x86)/codeblocks/mingw/bin/../lib/gcc/mingw32/4.7.1/crtbegin.o:cygming-crtbegin.c:(.text+0x0): first defined here
obj\Debug\main.o:cygming-crtbegin.c:(.text+0x32c): multiple definition of `__gcc_deregister_frame'
c:/program files (x86)/codeblocks/mingw/bin/../lib/gcc/mingw32/4.7.1/crtbegin.o:cygming-crtbegin.c:(.text+0x4c): first defined here
obj\Debug\main.o:crt1.c:(.bss+0x4): multiple definition of `_argc'
c:/program files  (x86)/codeblocks/mingw/bin/../lib/gcc/mingw32/4.7.1/../../../crt2.o:crt1.c:(.bss+0x4):first defined here
obj\Debug\main.o:crt1.c:(.bss+0x0): multiple definition of `_argv'
c:/program files (x86)/codeblocks/mingw/bin/../lib/gcc/mingw32/4.7.1/../../../crt2.o:crt1.c:(.bss+0x0): first defined here
c:/program files (x86)/codeblocks/mingw/bin/../lib/gcc/mingw32/4.7.1/crtbegin.o:cygming-crtbegin.c:(.text+0x45): undefined reference to `_Jv_RegisterClasses'
collect2.exe: error: ld returned 1 exit status
Process terminated with status 1 (0 minute(s), 1 second(s))
13 error(s), 0 warning(s) (0 minute(s), 1 second(s))

我根本无法弄清楚为什么它不起作用。如果有人可以帮助我,我将非常感激。

【问题讨论】:

您使用的可能是 c 文件而不是 cpp 文件 啊!查看编译器标志 - 如果我没记错的话,您需要添加 -c obj\Debug\main.o:crt1.c 看起来很奇怪 - 这表明 main.o 是通过编译 crt1.c 创建的,它是 C 运行时的一部分。您的日志不显示编译步骤,仅显示链接步骤 - 您可以从“重建”(即先清理然后构建)发布完整的构建日志吗? @Conduit,你是对的,当没有添加 -c 时会发生此错误。 如果我使用 Cmakelist 创建代码块项目,谁能告诉我如何在代码块中添加 -c。 【参考方案1】:

我遇到了同样的问题——结果证明是不使用 -o name.exe 指定输出的坏情况 如果编译器在其移交的源文件中发现二进制文件,它不会抛出特定错误 - 而是尝试将其用作某个库 - 当它发现 main 和 all 出现两次时,就会出错。

【讨论】:

我也忘记了-o 选项:)。谢谢。

以上是关于C++:“mainCRTStartup”错误等的多重定义的主要内容,如果未能解决你的问题,请参考以下文章

在 MSYS 环境中使用 MSVC 工具链(例如:CL.EXE)时,如何避免“未解析的外部符号 _mainCRTStartup”错误?

mainCRTStartup 的签名是啥

C++入口不是main?知乎上都快打起来了,你们不要再打了啦。

可执行程序的入口点在那里?(强化概念:程序真正的入口是mainCRTstartup)

C++入口不是main?知乎上打起来了!

LNK2019:错误。使用 InternetOpen InternetReadFIle 的 C++ 程序中未解析的外部符号