【问题标题】:Error in using GCC Linker under MinGW [closed]在 MinGW 下使用 GCC 链接器时出错 [关闭]
【发布时间】:2016-10-24 19:13:03
【问题描述】:

编译过程分为4个阶段:

  1. 预处理器 -扩展宏和头文件。
  2. 编译器 - 将源代码转换为汇编语言
  3. 汇编器 - 将汇编代码转换为机器代码
  4. 链接器 - 链接机器代码以形成单个可执行文件。

假设我们需要编译名为 test.cpp 的源代码,那么所需的命令将是:

  1. cpp test.cpp>test.i [输出为.i文件,扩展头文件 文件和宏]
  2. g++ -S test.i [输出为.s文件,汇编语言文件]
  3. as -o test.o test.s [输出为.o文件,取决于机器 机器码]
  4. ld -o test.exe test.o [输出为.exe文件,可执行文件 可以直接被操作系统运行]

所以问题出在最后一步,我收到以下错误:

test.o:test.cpp:(.text+0x32): 未定义引用__mingw_vprintf' test.o:test.cpp:(.text+0x4a): undefined reference to__main' test.o:test.cpp:(.text+0x75): 未定义引用std::ios_base::Init::~Init()' test.o:test.cpp:(.text+0xa5): undefined reference tostd::ios_base::Init::Init()' test.o:test.cpp:(.text+0xb1): 未定义引用atexit' ld: test.o: bad reloc address 0x0 in section.pdata' ld:最终链接失败:无效操作

注意:是的,我们可以通过使用“g++ test.cpp”来获得可执行的 a.exe 来避免这些步骤,但目的是了解构建过程的每个步骤。

【问题讨论】:

  • 根据您的个人资料,您已成为会员 11 个月。您应该更了解如何提出(和格式化)问题
  • 你在哪里链接 C++ 标准库(更普遍的是你的工具链的运行时)?你为什么要直接调用ld?你的目标是什么?
  • @UnholySheep:同意!我会改写。
  • @LightnessRacesinOrbit:调用链接器 (ld) 时出现错误。前面的阶段 [预处理器、编译器、汇编器] 工作正常。我想知道编译过程的完整功能。
  • @LightnessRacesinOrbit:问题,我正在寻找谁的答案是,“如何将机器代码文件(.o 文件)转换为可执行文件(.exe)?”

标签: c++ gcc compiler-errors linker-errors mingw32


【解决方案1】:

链接gcc 而不是ld

gcc -o test.exe test.o

【讨论】:

  • 是捷径,我想知道编译过程的底层工作,包括预处理器(cpp)、编译器(gcc)、汇编器(as)和链接器(ld)。现在 ld 是我卡住的地方!即在使用 ld 命令时出现错误!
  • 你猜错了ld 命令行应该是什么。与g++ -o test.exe test.o -Wl,-v 链接以查看实际的ld 命令行。
  • Riviere:以详细模式 (-v) 编译程序会提供大量信息。当我想通过调用链接器(ld)而不是一般的 g++ 命令来创建可执行文件时,我如何确定需要哪些库。
  • @Vickey:你试过我给你的确切命令行吗,-Wl,-v?它准确地告诉您您想了解的系统信息,不多也不少。
  • Riviere:非常感谢,通过使用您告诉我的选项,我可以弄清楚链接器需要哪些库来创建可执行文件
猜你喜欢
  • 2015-01-02
  • 1970-01-01
  • 2010-12-28
  • 2012-06-20
  • 2013-10-28
  • 1970-01-01
  • 2020-07-30
  • 1970-01-01
  • 2021-08-15
相关资源
最近更新 更多