|
dll파일명, lib파일명, 헤더 파일명이 서로 일치하는 것과 링크되는 것은 아무런 관련이 없구요. 일반적으로 파일명을 일치해 주는 것이 보편적이지만, 그렇지 않은 경우도 많이 있습니다.
dependency walker와 같은 프로그램으로 DLL 안에 들어 있는 함수목록을 보시고, 그 함수들이 헤더 파일에 그대로 있다면 일단 문제가 없는 것으로 보시면 됩니다.
함수의 호출 규약(stdcall, cdecl)이나, extern "C"가 있느냐 없느냐에 따라서 네임 맹글링이 달라져서, 링크할때 사용되는 함수 이름의 앞에 언더바가 붙을 수도 있고 안 붙을 수도 있습니다.
이런 것을 일일이 신경쓰면 머리만 아프니까, 다음과 같이 하면 일반적으로 SDK에서 제공되는 DLL을 어렵지 않게 C++빌더에 붙여 작업하실 수 있습니다.
0. test.dll이라는 파일에 대해 작업한다고 가정하고 설명해 드리겠습니다.
1. dependency walker와 같은 프로그램을 이용하여 dll에 들어 있는 함수와 제공된 헤더 파일에 있는 함수가 일치하는지 확인합니다. (일치하지 않는다면 헤더 파일이 누락된 것이며, 일부 몇몇 함수는 의도적으로 헤더 파일에 명시를 안 해 놓았을 수는 있습니다.)
2. SDK에 제공된 LIB파일은 VC++용일 가능성이 거의 100%이므로, VC++로 작업할 것이 아니니까, 지워버리세요.
3. implib.exe를 이용하여 lib파일을 만드는데, 다음과 같이 함수명에 언더바를 붙은 것과 안 붙인 것 두개를 만듭니다.
implib test1.lib test.dll -> 언더바가 없는 상태로 만들어짐
implib -a test2.lib test.dll -> 언더바가 추가되어 만들어짐
4. C++빌더로 만든 프로그램의 소스 파일에 다음과 같이 lib파일을 추가합니다.
( lib파일은 프로그램 소스 디렉토리에 같이 넣어주던지, 해당 프로젝트에서 lib파일이 있는 PATH를 환경설정에서 추가해 줘야 합니다. )
#pragma comment (lib, "test1.lib")
#pragma comment (lib, "test2.lib")
5. 컴파일, 링크해서 정상적으로 잘 되는지 봅니다. (여기서 오류가 난다면 오류메시지가 뭔지에 따라서 해결 방법이 달라질 수 있습니다.)
6. 3번에서 추가된 lib파일을 한줄씩 주석처리하여, 컴파일/링크해 보면 두개 중 하나는 필요없다는 것을 알 수 있습니다. 필요없는 하나는 삭제해 주세요. (간혹 두 개다 필요한 경우도 있습니다. 그런 경우에는 삭제할 필요 없음)
7. 일반적으로 그런 경우는 거의 없지만, 네임 맹글링 때문에 DLL에 포함된 함수명이 복잡하게 되어 있을 때는, DLL파일에서 함수정보(name, ordinal)을 구해서 def파일을 만들고, 만들어진 def파일을 이용해서 lib파일을 만들어야 되는 경우가 있습니다. 이 과정은 조금 번거러워서 생략합니다.
동적 로딩(LoadLibrary)으로 잘 된다면, 일반적으로 위와 같은 방법으로 정적로딩하는데 문제가 없다고 보여집니다.
모쪼록 도움이 되셨길 바랍니다.
Chobomi 님이 쓰신 글 :
: 거래처에서 다음과 같은 파일들을 받았는데요.
:
: AAACore.dll
: AAACore.lib
: BBB_stdcall.dll
: BBB_stdcall.lib
:
: TaskCaster.h
: TaskDefines.h
: TaskHandler.h
: TaskInline.h
: BBB.h
:
: 보시다 시피 lib 에 맞는 헤더 파일이 없어요. 보내준 측에서는 비주얼스튜디오에서 링크해서 쓰면 잘되다는데요. C++ 빌더에선 아무리 해도 안 붙네요.
:
: Implib, coff2omf 다 써봤습니다만...
:
: 헤더랑 lib 랑 파일이름이 다른데 어떻게 링크가 되는지 모르겠어요. 이름을 일부러 바꿔봐도 안되고....
:
: 결국 loadlibrary 로 불러서 사용했는데, 거래처에선 저게 맞다고 계속 주장 하는데요. 제가 모르는 어떤 방법이 있는걸까요? ㅠㅠ
|