2012-09-11 2 views
2

도움이 많이 되었기 때문에 이마가 멍이 들었습니다.VS2010 업그레이드 후 lib에 연결할 수 없습니다 (__cdecl vs __thiscall?)

우리는 정적 인 lib로 사용하는 큰 오픈 소스 DICOM 라이브러리 (dcmtk)를 가지고 있습니다. 관리되지 않는 C++이며 관리되는 C++ DLL에서 연결됩니다. 그것은 CMake를 사용하여 다양한 플랫폼에 대한 빌드 지침을 작성합니다. VS2010 (2008 년 이후)으로 이동하면 빌드가 파손되었으므로 우리는 사용중인 라이브러리 버전도 업데이트 할 수있는 기회를 얻었습니다 (더 많은 숫자는 VS2010이어야 함). lib를 돌리는 일부 유형이 이제 빌드됩니다 (유형 변환에 대해 수천 가지 경고 표시). 그러나 이제는 그것을 사용하는 코드는 링크되지 않습니다. 해결되지 않은 외부 기호 오류가 발생합니다.

라이브러리 확인 중입니다. lib 파일 이름을 변경하면 이전에 적절한 msg를 사용하여 해당 파일을 삭제했습니다. 이 ... 가 000000000000000E : C3

[email protected]@[email protected] (public: __cdecl OFString::~OFString(void)) RET :

0000000000000000: 40 53    push  rbx… 

하지만, 링커가 그것을 발견하지 않습니다 내가 DUMPBIN과 LIB 파일을 분해하면

나는, 예를 들어, 해당 토큰을 참조

error LNK2001: unresolved external symbol "public: __thiscall OFString::~OFString(void)" ([email protected]@[email protected]) 

저는이 이론이 __cdecl vs. __thiscall 불일치라는 이론을 연구하고 있습니다. b ut은 다른 규칙으로 lib를 빌드하기 위해 VS를 얻을 수 없었습니다. (역설적이게도, emit __thiscall을하는 오래된 2008 버전은 /과 같은/Gd 옵션으로 컴파일 된 것으로 보인다).

통찰력이 있으십니까?

답변

4

맹 글링이 다른 것을 볼 수 있습니다.

Undecoration of :- "[email protected]@[email protected]" 
is :- "public: __cdecl OFString::~OFString(void) __ptr64" 

대 : 또한

Undecoration of :- "[email protected]@[email protected]" 
is :- "public: __thiscall OFString::~OFString(void)" 

, 당신의 x64 및 x86의 혼합을하고 undname.exe는 원인이 도움이 될 수 있습니다 사용하십니까?

+0

오른쪽에서 보았을 때, 그리고 mangle 차이를 보지 못했습니다 - 감사합니다. lib는 x64 용으로 제작됩니다. 관리되는 DLL은 Win32를 구축 중이며 이제 x64로 설정됩니다.이 DLL은 수십 개의 미해결 심볼로 구성됩니다. 위의 문제가 해결되었습니다 ... 남은 부분에 대한 세부 정보를 찾을 수 있습니다 ... – Riker

관련 문제