У меня есть этот простой образец:
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
Я прочитал несколько уроков, посмотрел видео и до сих пор не могу понять, что я делаю неправильно. Почему я получаю эту неопределенную ошибку ссылки?
Внешняя сфера С символы имеют начальное подчеркивание, поэтому попробуйте:
.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):
...
(см. пример Вот).
Других решений пока нет …