2014-01-07 1 views
1

나는이 간단한 샘플이 있습니다`로 정의되지 않은 참조 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을 사용하여 컴파일하려고 할 때. 나는 얻는다 :

나는 약간 자습서를 읽고 나는 영상을보고 나는 아직도 나가 그릇되게하고 있다는 것을 알아낼 수 없다. 왜 정의되지 않은 참조 오류가 발생합니까? 나는 어디 어셈블러 파일, 다음 매크로를 사용

.section .text 

.global _GetMagicNumber 

_GetMagicNumber: 
    movl $42, %eax 
    ret 

편집를 사용하면 코드를보다 멀티 플랫폼 만들려면 :

+0

개체 파일의 순서가 중요합니다. – PlasmaHH

+0

.o 및 .cpp의 순서가 변경되었지만 여전히 동일한 오류가 발생합니다. 내 목표는 내 코드에 NEON 및 SSE2 최적화 기능을 추가하는 것입니다. Visual Studio를 사용해 보았는데 작동합니다. 그런 다음 외부 어셈블리 파일을 Qt Creator에 추가하려고 시도했지만 링크 할 수 없었습니다. 그래서 나는 아주 간단한 것을 시도하고있다. 이 예제는 기본적으로이 비디오 자습서에서 비디오 자습서에서 수행하는 작업이며 작동합니다. http://www.youtube.com/watch?v=jR6BnVGpAe0&list=PLKK11Ligqiti8g3gWRtMjMgf1KoKDOvME – Zingam

+0

아래 질문에 대한 답변이 있으니 마킹을 고려해보십시오. 그 중 하나는 투표 수 아래의 눈금을 클릭하여 '수락 됨'으로 표시됩니다. 이것은 어떤 대답이 가장 도움이되었는지 보여주고 답변 작성자 (그리고 당신에게!)에게 평판 포인트를 할당합니다. upvotes 및 답변 수락을 통해 좋은 질문과 답변을 식별하는 것은이 사이트의 아이디어의 일부입니다. – Jubobs

답변

1

외부 범위 C 문자는 밑줄을, 그래서 시도 따라서 전처리 재생할 수 있도록 상기 C 컴파일러에 의해 처리되는 확장 .S 가지고

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

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

는 (예를 참조,).

+0

네, 맞습니다! 나는 그것이 효과가 있다는 것을 알았다. 고맙습니다! 그러나 나는 리눅스에서 리눅스를 시험해보기 위해 특별히 리눅스를 설치했다. gcc 4.6은 밑줄없이 코드를 컴파일 할 것이다. 실제로 밑줄을 넣으면 코드가 컴파일되지 않습니다. 그래서 MinGW에서 밑줄을 써야하고 리눅스에서 제거해야합니다. 왜 이렇게이다? 나는 지금 완전히 혼란 스럽다. – Zingam

+0

@Zingam 답변을 업데이트했습니다. – trojanfoe

+1

플랫폼마다 플랫폼 이름이 다를 수 있습니다. Windows에는'cdecl' 호출 규칙에 대한 주요한 밑줄과'stdcall'에 대한 다른 규칙이 있습니다. –