【问题标题】:Multiple "multiple definition of ..." while compiling simple Hello World编译简单的Hello World时多个“...的多个定义”
【发布时间】:2015-09-13 08:49:41
【问题描述】:

我正在使用 MinGW 在 Eclipse C/C++ Mars Edition 中编译简单的 Hello World。

代码:

#include <iostream>

using namespace std;

int main(){
    cout << "Hello World!" << endl;
}

编译器标志:

-I"H:\Eclipse\Workspace\Project" -O0 -Wall -static -static-libgcc

错误:

multiple definitions of '__gcc_deregister_frame'
multiple definitions of '__gcc_register_frame'
multiple definitions of '_argc'
multiple definitions of '_argv'
multiple definitions of '_mingw32_init_mainargs'
multiple definitions of '_onexit'
multiple definitions of 'atexit'
multiple definitions of 'mainCRTStartup'
multiple definitions of 'WinMainCRTStartup;

【问题讨论】:

  • 去掉链接器自动添加的-static-libgcc。同样对于 c++ 它应该是 -static-libstdc++
  • FWIW,我无法使用(交叉编译)命令mingw32-g++ -O0 -Wall -static -static-libgcc foo.cpp 重现此内容; (尽管有些标志可能是多余的,但它编译和链接都成功)。您需要 a) 学习从命令行测试编译命令,(不依赖任何 IDE 作为拐杖),以及 b) 显示您的 IDE 调用的命令的完整文本代表。这似乎不是 MinGW 问题;更有可能是您的 IDE/项目配置有问题。

标签: c++ eclipse mingw


【解决方案1】:

MinGW 默认链接标准库,libstdc++ 是静态的,libgcc 是共享的(因为他来自 Unix GCC)。 -static 通常是-static-libgcc 的快捷方式,与之相反的是-shared-libgcc(如果编译器默认为静态链接,则很有用,例如TDM GCC)。

两个静态链接的组合是多余的(请参阅GCC links options),只需使用static。您只能得到这几个符号,因为优化器会丢弃不用的符号。

主要问题可能是,您不会编译多个目标文件并链接一次,而是将所有目标文件与标准库链接,最后将它们链接在一起。

【讨论】:

  • “没用”是别人能给出的最没用的答案!发生了什么?错误信息是否发生了变化,她看起来如何?您当前的命令行(完全)是什么?你用的是哪个 MinGW 项目?再具体点,我不喜欢猜测。
  • 我使用了和以前一样的项目。错误消息根本没有改变。编译器标志如下-I"H:\Eclipse\Workspace\Project" -O0 -Wall now。
  • 同一个的规范多次不会导致多次定义错误;这些多个定义必须源自独立的目标文件(作为一个或多个源翻译单元中的重复定义,或者作为对链接器的同一目标文件的重复说明)。
  • @KeithMarshall 在很久以前,我确实遇到过 GCC 编译器无法识别多个相同链接的问题,但你是对的,现在不应该这样。这就是为什么我要求提问者展示他的整个命令和错误信息。最后,我猜他只是错过了编译选项-c 和链接、链接、链接(答案已更新)。
猜你喜欢
  • 1970-01-01
  • 2012-09-10
  • 2022-07-13
  • 1970-01-01
  • 1970-01-01
  • 2011-03-03
  • 1970-01-01
  • 1970-01-01
  • 2016-03-19
相关资源
最近更新 更多