MinGW下使用GCC Linker报错
Error in using GCC Linker under MinGW
编译过程分为4个阶段:
- 预处理器
-扩展宏和头文件。
- 编译器
-将源代码转换为汇编语言
- 汇编程序
- 将汇编代码转换为机器代码
- 链接器
-links 形成单个可执行文件的机器代码。
假设我们有需要编译的名为 test.cpp 的源代码,因此所需的命令将是:
- cpp test.cpp>test.i [输出为.i文件,header的扩展
文件和宏]
- 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 to
std::ios_base::Init::Init()' 的未定义引用
test.o:test.cpp:(.text+0xb1): 对 atexit'
ld: test.o: bad reloc address 0x0 in section
.pdata 的未定义引用
ld: final link failed: 无效操作
注意:是的,我们可以通过使用 "g++ test.cpp" 来获得可执行文件来避免这些步骤 a.exe 但目的是了解构建过程的每个步骤。
Link 用 gcc
代替 ld
:
gcc -o test.exe test.o
编译过程分为4个阶段:
- 预处理器 -扩展宏和头文件。
- 编译器 -将源代码转换为汇编语言
- 汇编程序 - 将汇编代码转换为机器代码
- 链接器 -links 形成单个可执行文件的机器代码。
假设我们有需要编译的名为 test.cpp 的源代码,因此所需的命令将是:
- cpp test.cpp>test.i [输出为.i文件,header的扩展 文件和宏]
- 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 to
std::ios_base::Init::Init()' 的未定义引用
test.o:test.cpp:(.text+0xb1): 对 atexit'
ld: test.o: bad reloc address 0x0 in section
.pdata 的未定义引用
ld: final link failed: 无效操作
注意:是的,我们可以通过使用 "g++ test.cpp" 来获得可执行文件来避免这些步骤 a.exe 但目的是了解构建过程的每个步骤。
Link 用 gcc
代替 ld
:
gcc -o test.exe test.o