гиперссылка — Попытка скомпилировать Assembly + C ++ с помощью MinGW: ccqKAvXJ.o: main.cpp :(. text + 0x18): неопределенная ссылка на `GetMagicNumber ‘

У меня есть этот простой образец:

main.cpp:

#include <iostream>

extern "C" int GetMagicNumber();

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

functions.s:

.section .text

.global GetMagicNumber

GetMagicNumber:
movl $42, %eax
ret

и 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

или же

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

Когда я пытаюсь скомпилировать с MinGW 4.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

Я прочитал несколько уроков, посмотрел видео и до сих пор не могу понять, что я делаю неправильно. Почему я получаю эту неопределенную ошибку ссылки?

1

Решение

Внешняя сфера С символы имеют начальное подчеркивание, поэтому попробуйте:

.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):
...

(см. пример Вот).

1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector