2010-02-23 1 views
2

win32 exe 프로젝트를 링크 할 때이 오류가 발생합니다. 이 메서드에 대한 코드가 들어있는 lib에 연결했습니다. 하지만 아직 해결되지 않은 기호 오류가 발생합니다. lib가 링크 될 때 해결되지 않은 외부 기호, 컴파일러가 함수 이름에 'A'문자를 추가합니다.

error LNK2001: unresolved external symbol "public: bool __thiscall SharedJobQueue::AddJobA(class boost::shared_ptr<class domain::Job>)" ([email protected]@@[email protected]@[email protected]@@[email protected]@@Z)

는 이유는 끝에 'A'와 AddJobA을 말하는가. 메서드는 AddJob로 선언됩니다.

'dumpbin/symbols'의 출력을 살펴본 결과 AddJob이 아닌 AddJob에 대한 기호 만 포함되어 있습니다. 컴파일러가 함수 이름 끝에 'A'를 추가하는 이유는 무엇입니까?

답변

4

여기 매크로에 매크로 문제가 있습니다.

코드 자체에는 아무런 문제가 없으며 문제는 Windows 라이브러리와 관련이 있습니다. 실제로는 AddJob이라는 Win32 헤더에있는 함수가 있지만, 그다지 ... Addjob 함수를 선언하지는 않지만 대신에 각각 UnjordA 및 Unicode 문자열을 처리하는 AddJobA 및 AddJobW 함수를 선언하십시오.

함수 이름 끝에 A은 유니 코드를 처리하기 위해 정의 된 Windows 헤더에 정의 된 매크로 때문입니다. 기본적으로 그들은 뭔가를해야합니다 :

이 사람들은 AddJob를 사용하고 매크로가 올바른 유니 코드/비 유니 코드 기능으로 기능을 가리 킵니다 수 있습니다
#ifdef UNICODE 
# define AddJob AddJobW 
#else 
# define AddJob AddJobA 
#endif 

. 문제는 물론 #define이 모든 것에 영향을 미치므로 문제가 사용자의 기능에 어떤 영향을 미치는지입니다.

이 문제를 해결하려면 #undef AddJob 또는 단순히 함수 이름을 Win32 함수가 아닌 것으로 변경할 수 있습니다.

+0

매크로를 사용하여 win32 헤더에서 이미 "가져온"이름 목록이 있습니까? 그래서 내가 사용해서는 안되는 이름을 알 수 있습니다. –

+0

좋은 질문입니다. 나는 거기 있다고 믿지 않지만, 다시는 보지 못했습니다. 가장 쉬운 방법은 msdn.microsoft.com으로 가서 "use"에 있는지 확인하는 데 사용할 함수의 이름을 검색하는 것입니다. –

+0

나는 "매크로가 문제"라고 여기까지 멀지는 않을 것이다. 이것들은 저수준의 win32 API 전체에서 일정한 방식으로 사용됩니다. –

1

Windows 기능의 끝 부분에 A 또는 W이있을 수 있습니다. - A은 ASCII를 나타내고 W은 넓은 고정 크기의 유니 코드를 나타냅니다. 프로젝트 설정에 따라 사용되는 기능이 결정됩니다. 당신이 당신의 프로젝트에 대한 유니 코드 사용 가능 한 경우 addJob는

5

MS는 유니 코드 및 ANSI 모두 A 또는 W와 함수 이름을 부기 빌드를 지원하는 Win32 API를 위해 매크로를 사용합니다 .. 마지막에 W 있었다 수 있습니다.
AddJob()은 Win32 API의 함수이므로 매크로가 있습니다. #undef AddJob을 사용하면 문제를 해결할 수 있습니다.

관련 문제