【发布时间】:2016-10-24 19:13:03
【问题描述】:
编译过程分为4个阶段:
- 预处理器 -扩展宏和头文件。
- 编译器 - 将源代码转换为汇编语言
- 汇编器 - 将汇编代码转换为机器代码
- 链接器 - 链接机器代码以形成单个可执行文件。
假设我们需要编译名为 test.cpp 的源代码,那么所需的命令将是:
- cpp test.cpp>test.i [输出为.i文件,扩展头文件 文件和宏]
- g++ -S test.i [输出为.s文件,汇编语言文件]
- as -o test.o test.s [输出为.o文件,取决于机器 机器码]
- 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