C++ 试图编译汇编+;C++;使用MinGW:ccqKAvXJ.o:main.cpp:(.text+;0x18):未定义对“GetMagicNumber';

C++ 试图编译汇编+;C++;使用MinGW:ccqKAvXJ.o:main.cpp:(.text+;0x18):未定义对“GetMagicNumber';,c++,hyperlink,compilation,.net-assembly,C++,Hyperlink,Compilation,.net Assembly,我有一个简单的例子: main.cpp: #include <iostream> extern "C" int GetMagicNumber(); int main(void) { std::cout << "The magic number is: " << GetMagicNumber(); return 0; } 和build.bat: C:\Qt\Qt5.2.0\Tools\mingw48_32\bin\as functions.

我有一个简单的例子:

main.cpp:

#include <iostream>

extern "C" int GetMagicNumber();

int main(void)
{
    std::cout << "The magic number is: " << GetMagicNumber();
    return 0;
}
和build.bat:

C:\Qt\Qt5.2.0\Tools\mingw48_32\bin\as functions.s -o functions.o
C:\Qt\Qt5.2.0\Tools\mingw48_32\bin\g++ functions.o main.cpp -o MagicNumber.exe

当我试图用mingw4.8编译时。我得到:

C:\Qt\Qt5.2.0\Tools\mingw48_32\bin\gcc functions.s main.cpp -lstdc++ -o MagicNumber.exe
C:\Users\...\Local\Temp\ccqKAvXJ.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
编辑如果您想使代码更不受平台影响,我使用以下宏,其中汇编程序文件有一个由C编译器处理的
.S
扩展名,允许预处理器执行:

#ifdef __APPLE__
#define NAME(name) _##name
#else
#define NAME(name) name
#endif

.globl NAME(GetMagicNumber);
NAME(GetMagicNumber):
    ...

(请参见示例)。

对象文件的顺序很重要。我更改了.o和.cpp的顺序,但仍然得到相同的错误。我的目标是在代码中添加NEON和SSE2优化的函数。我试过VisualStudio,它很管用。然后我尝试在Qt Creator中添加外部程序集文件,但无法将它们链接到。这就是为什么我要尝试一些非常简单的东西。这个例子基本上是这个家伙在他的视频教程中所做的,它的工作原理是:既然你下面有一些回答似乎回答了你的问题,请考虑点击其中一个为“被接受”,点击他们的选票计数下的TikMax。这显示了哪个答案对你帮助最大,并为答案的作者(和你!)分配了声誉点数。通过投票和接受答案来确定好的问题和答案是本网站想法的一部分。是的,你是对的!我做到了这一点。非常感谢。但是我专门安装了Linux来在Linux上试用,GCC4.6将编译没有下划线的代码。实际上,如果我加下划线,代码就不会被编译。所以在MinGW上我需要加下划线,在Linux上我必须删除它。为什么会这样?我现在完全糊涂了。不同的平台有不同的名称混乱约定。Windows在
cdecl
调用约定中有一个前导下划线,在
stdcall
中有一个不同的约定@SebastianRedl是的,没错。我不在Windows下使用GNU汇编程序,而是使用一个单独的与Microsoft兼容的汇编程序源文件(
.asm
)。
.section .text

.global _GetMagicNumber

_GetMagicNumber:
    movl $42, %eax
    ret
#ifdef __APPLE__
#define NAME(name) _##name
#else
#define NAME(name) name
#endif

.globl NAME(GetMagicNumber);
NAME(GetMagicNumber):
    ...