2011-12-22 3 views
11

.dll/.libs를 사용하는 방법에 대한 일반적인 질문이 있습니다. 내 프로젝트에 사용할 .dll을 만들고 있지만 컴파일 할 때 .dll과 정적으로 연결해야 컴파일 할 수 있습니다 (그렇지 않으면 연결 오류가 "치명적"입니다. 오류 LNK1107 : 파일이 잘못되었거나 손상되었습니다. 0x300에서 읽을 수 없습니다. "). 나중에 프로젝트를 redistrobute하고 미래에 업데이트하면 새로운 .exe와 새 .dll이 새로운 .dll 파일이 아닌 출시 될 필요가 있습니까? 그렇다면 왜 .dll을 사용하여 귀찮게합니까?Lib 및 DLL이 exe 오류로 연결되면 "0x300에서 읽을 수 없습니다."

답변

29

.lib에는 DLL에서 내 보낸 함수 등의 스텁이 들어 있습니다. .lib를 EXE에 연결하면 EXE가 함수를 호출하는 방법을 알게됩니다. 물론 거기에는 아무런 기능이 없습니다. 로드 할 때 운영 체제가 EXE를로드하면 DLL도로드 된 다음 EXE를 패치합니다. EXE가 스텁에 호출되면 로더는이를 호출하여 DLL의 실제 함수로 바꿉니다.

일반적으로 고객에게 .lib를 제공 할 필요가 없습니다. 그러나 고객이 DLL을 사용하는 자체 EXE를 작성하려는 경우 .lib을 보내야 EXE와 EXE를 연결할 수 있습니다.

링커 오류 LNK1107은 .lib가 아니라 DLL에 연결하려고했음을 의미합니다. 정의에 따르면 DLL은 빌드시 정적으로가 아니라 런타임시 동적으로 링크되기 때문에 항상 잘못되었습니다.

+0

나는 당신이 제안한 것을 시도하고있다. 내 문제는 디버그 모드에서 빌드 할 때 lib 파일이 생성되지 않는다는 것입니다. dll 파일 만 생성됩니다. 디버그 버전에서 어떻게 lib 파일을 생성 할 수 있습니까? –

+0

귀하의 의견은 당신이 릴리스 빌드에서 lib 파일을 얻을 수 있지만 디버그 빌드에서 얻을 것을 제안하는 것 같습니다. 그게 맞습니까? 그렇다면 두 빌드에서 동일한 링커 옵션을 설정했는지 확인하십시오 (릴리스와 디버그간에 다를 필요가있는 경우 제외). –

+0

DLL에 DLL이 포함되어 있으면 일반적으로 링커에서 자동으로 가져 오기 라이브러리를 생성합니다 함수를 __declspec (dllexport) 특성으로 사용하거나 함수를 DEF 파일로 명시 적으로 내보내는 경우 __declspec (dllexport)는 #ifndef (_DEBUG) 또는 그와 비슷한 것으로 둘러 쌓여 있기 때문에 컴파일러에서 제외됩니까? –

관련 문제