2009-10-01 4 views
2

내 링커 오류를보고 :되지 않은 외부 신비

unresolved external symbol "unsigned char __fastcall BD_CLC(int,int)"... 

을하지만이 기능뿐만 아니라 함수의 정의에 대한 모든 참조는 형태의 것을 유지 :

__forceinline UBYTE BD_CLC(int swap,int elem); 

"전처리 된 파일 생성"이 설정된 컴파일을 설정하고 출력을 살펴 보았습니다. BD_CLC가 사용 된 모든 파일에서 함수는 실제 함수 정의가

__forceinline UBYTE BD_CLC(int swap,int elem) { ... } 

어떤 아이디어가 선언 된

__forceinline UBYTE BD_CLC(int swap,int elem); 

물론

로 선언했다?

답변

2

__forceinline 함수를 선언 했으므로 선언이 아닌 정의가 함수가 호출되는 모든 곳에서 표시되는지 확인해야합니다.

+0

함수가 호출되는 모든 파일에서 프로토 타입 __forceinline UBYTE BD_CLC (int swap, int elem); 함수가 호출되기 전에 나타납니다. 이것은 전처리 기가 생성 한 ".i"파일에 따른 것입니다. – Mick

+4

프로토 타입뿐만 아니라 몸도 볼 수 있어야합니다. __forceinline을 사용하면 함수가 호출되는 곳마다 생성 된 코드로 본문을 축 어적으로 떼어 내도록 컴파일러에 지시하지만 본문을 볼 수 없으면 호출을 생성 할 수 없으므로 호출을 생성합니다. 하지만 __forceinline을 사용했기 때문에 본문에 대한 코드가 별도로 생성되지 않으므로 호출 대상을 확인할 수 없어 링크 오류가 발생합니다. – moonshadow

+0

그래서 헤더 파일에 선언을 넣고 선언을해야할까요? 그럼 어디서나 시체가 너무 보이지 않아야 포함되어 있습니까? –

1

/GR "Calling Convention"컴파일러 옵션을 해제해야 할 수도 있습니다. 아마도 __fastcall로 인해 링커 오류가 발생했을 수 있습니다.

/할머니 는 C++ 부재 sfunctions 및 기능 표시 __cdecl 또는 __stdcall 제외한 모든 함수 호출 규칙 __fastcall를 지정한다. 모두 __fastcall 함수에는 프로토 타입이 있어야합니다.

+0

하지만 프로그램은 속도가 중요합니다. 나는 __fastcall을 끄고 싶지 않습니다. – Mick

+0

컴파일 단위마다 켜져 있습니까? –

+0

@neil, yes - 프로젝트 속성에 설정 됨. – Mick

0

__forceinline 속성을 제거하려고합니다.