尝试使用 MinGW 编译 Assembly + C++:ccqKAvXJ.o:main.cpp:(.text+0x18):对 'GetMagicNumber' 的未定义引用

Trying to compile Assembly + C++ with MinGW: ccqKAvXJ.o:main.cpp:(.text+0x18): undefined reference to `GetMagicNumber'

本文关键字:text+0x18 引用 cpp 未定义 GetMagicNumber main MinGW 编译 Assembly ccqKAvXJ C++      更新时间:2023-10-16

我有这个简单的示例:

主.cpp:

#include <iostream>
extern "C" int GetMagicNumber();
int main(void)
{
    std::cout << "The magic number is: " << GetMagicNumber();
    return 0;
}

函数:

.section .text
.global GetMagicNumber
GetMagicNumber:
    movl $42, %eax
    ret

和构建.bat:

C:QtQt5.2.0Toolsmingw48_32binas functions.s -o functions.o
C:QtQt5.2.0Toolsmingw48_32bing++ functions.o main.cpp -o MagicNumber.exe

C:QtQt5.2.0Toolsmingw48_32bingcc functions.s main.cpp -lstdc++ -o MagicNumber.exe

当我尝试使用 MinGW 4.8 进行编译时。我得到:

C:QtQt5.2.0Toolsmingw48_32bingcc functions.s main.cpp -lstdc++ -o MagicNumber.exe
C:Users...LocalTempccqKAvXJ.o:main.cpp:(.text+0x18): undefined reference to `GetMagicNumber'
collect2.exe: error: ld returned 1 exit status

我已经阅读了一些教程,我看了视频,但我仍然无法弄清楚我做错了什么。为什么会出现未定义的引用错误?

外部作用域 C 符号具有前导下划线,因此请尝试:

.section .text
.global _GetMagicNumber
_GetMagicNumber:
    movl $42, %eax
    ret

编辑 如果你想使代码更加与平台无关,我使用以下宏,其中汇编程序文件有一个.S扩展名,由 C 编译器处理,允许预处理器一起播放:

#ifdef __APPLE__
#define NAME(name) _##name
#else
#define NAME(name) name
#endif
.globl NAME(GetMagicNumber);
NAME(GetMagicNumber):
    ...

(请参阅此处的示例)。

相关文章: