2013-12-14 4 views
1

vs2012를 사용하여 VC6으로 빌드 된 다른 DLL (.lib)에 링크하는 작은 래퍼 DLL을 만듭니다.vc6 dll/lib에 링크 할 때 확인되지 않은 기호

내가 좋아하는 링크 오류를 얻을 : 내가 과거에했던대로,

error LNK2019: unresolved external symbol [email protected] 

내가 링크 라인에 VC6 DLL을 함께 제공 lib 디렉토리 파일을 추가 ... 일부 버전의 문제는 여기에있다? VC6의 DLL 헤더 파일 내가 표준 방법입니다 생각의 함수를 선언

#define DLLIMPORT extern "C" __declspec(dllimport) 
DLLIMPORT ULONG WINAPI functionName(...); 

DUMPBIN 사용 /를 VC6 lib 디렉토리 파일에 대한 수출은 꼬마 도깨비 접두사없이 "FUNCTIONNAME"를 표시하고 "8 @".. 그게 문제인지 또는 그냥 덤프비가 좋고 나를 위해 쇠약 해지는지 확실하지 않습니다.

저는 윈도우 사용자가 아니며 링커가 기호를 찾지 못하는 이유를 모르겠습니다 ... 도움을!

+0

다시 보내주십시오. 원하지 않습니다. DLLIMPORT 및 WINAPI를 삭제해야하지만, .h 파일에 나타나면 정확하지 않을 수 있습니다. –

+0

음, 의견을 주셔서 감사합니다,하지만 왜 DLLIMPORT 및 WINAPI를 드롭해야합니까? DLLIMPORT는 컴파일러/링커에게 내가 참조하고있는 함수가 올바른 dll로 제공 될 것이라고 말하고 있습니다. WINAPI는 올바른 규칙이기도합니다. –

+0

DLLIMPORT는 DLL에 __imp로 시작하는 * 추가 ​​* 내보내기가 있다고합니다. WINAPI는 호출 규칙이 추가 @ 8을 생성하는 __stdcall이라고 말합니다. dumpbin.exe로는이 파일을 찾을 수 없으므로 다시 보내려합니다. 아무 쓸모가 없습니다. –

답변

3

해결! 두 가지 문제가 있습니다 :

1) dumpbin/exports가 모든 기호를 표시하지 않습니다. 대신/all을 사용하면 __imp_functionName @ 8 형식의 기호가 표시됩니다.

2) 링커는 __imp_이 아닌 __imp__ 형식의 기호를 vc6 lib에서 제공하는 것으로 찾고있었습니다. Google은 32 비트와 64 비트 빌드의 차이점을 알려 주므로 vc6 라이브러리는 32 비트 인 반면 64 비트 빌드였습니다.

내 랩퍼 dll을 64 비트로 변경하면 문제가 해결됩니다!

반나절 동안 잘 보냈습니다! 아마도. 아마 ... 아니. 내가 프로그래머가되는 것을 좋아할 때 이런 때가 왔습니다!

+0

64 비트 VC6 라이브러리? x64가 막 시작했을 때 일부 Windows SDK와 함께 배포되는'cl.exe' 12.xx의 amd64 타겟팅 버전이있을 수 있습니다. 그러나 그 컴파일러가 존재하더라도, 그것을 가지고 구축 된 라이브러리가 오늘날 다루어야 할 것 같지는 않습니다. –

+1

임포트 lib 헤더 파일은 컴파일러가 vc6이라고 주장합니다 ... 나는 몰라요. 그냥 지금은 행복하게 작동합니다. –

+0

흥미 롭습니다. 필자는 x86을 x64와 혼합하여 사용할 때 링커가 알려주는 것이 좋을 것이라고 생각합니다. 이런 종류의 질문은 드문 것이 전부는 아니며 솔루션에 대한 단서는 링커가 불평하는 이름에 누락되거나 추가 된 밑줄이어야한다는 것은 나에게 이해가 가지 않습니다. –