2017-09-22 7 views
0

웹을 검색했지만 쿼리와 다른 답변으로 검색했습니다. 나는 Windows 전문가가 아니지만 정확히 이해하고 싶습니다.Windows 응용 프로그램은 컴파일 타임에 DLL에 대해 알아야합니까?

핵심 라이브러리 kernel32.dll 또는 다른 사용자가 만든 dll을 사용하는 것과 같이 라이브러리 (DLL)의 런타임 연결에 대한 필요성을 포함하는 응용 프로그램을 Windows 용으로 컴파일하면 응용 프로그램에서 dll은 런타임 전에 존재합니다.

나는 dll에 .lib 파일이 있어야한다는 것을 읽었습니다.이 파일은 컴파일시에 링크되어야하지만 .lib 파일이 필요 없다고 명시되어 있습니다.

응용 프로그램이 실행되고 dll에 필요한 기능을 찾지 못하면 그냥 실패합니까?

미리 감사드립니다.

+0

예. DLL을 찾고 함수를 바인드하는 것은 OS 로더의 작업입니다. 기술적으로 LoadLibrary + GetProcAddress를 사용하여 프로그램 자체에서 동적으로 수행 할 수 있습니다. COM은 주목할 만하다. 하나의 수출 된 함수, 클래스 팩토리 만 필요하다. –

+0

다른 답변을 보는 이유는 컨텍스트에 따라 다릅니다. 무슨 일이 있어도 LoadLibrary와 GetProcAddress를 가져 오기 때문에'kernel32.lib'이 필요합니다. [Nitpicks 코너 : 기술적으로 다른 방법이 있지만 OP와 관련이 없습니다.] 일반적으로 다른 DLL에서도'.lib' 파일을 사용합니다. 그러나 당신은 그들없이 할 수 있습니다. 그리고 당신이 미리 알 수없는 DLL 이름, 예를 들어 플러그인을로드해야한다면, 플러그인을 사용할 수 있습니다. –

답변

-1

동적으로 링크 된 기능 목록은 PECOFF 실행 파일의 가져 오기 섹션에 보관되며, 옵션 헤더의 두 번째 디렉토리 항목으로 정의됩니다. 섹션의 일반적인 이름은 입니다 .idata 또는 IMPORT입니다. 가져 오기 디렉토리에 보관 유일한 필요한 정보는

  • 은 (경로 제외) 동적 라이브러리
  • 그래서 대답은 부정적이다의 파일 이름, 링커가 필요하지 않는 기능의

    1. 이름입니다 DLL에 대해 알고 있어야하며 링크 타임에 반드시 존재할 필요는 없습니다. 런타임에 참조 된 DLL을 찾을 수있는 로더의 작업입니다 (보고 오류 ). 항목 번호 FunctionName이 라이브러리에서 발견되지 않았습니다. 때문에 이전의 컴파일러 및 수입 기능과의 DLL을 선언 할 수있는 지침이 부족 링커의 존재, 그래서 그들은도 간접 프록시 IAT에 점프 수입 정의를 포함 링크 라이브러리를 필요 lib 디렉토리

      가져 오기 라이브러리. 그러나 좋은 링커는 이것을 필요로하지 않습니다.이 정보는 즉각적으로 으로 생성 될 수 있습니다.