2009-09-29 2 views
3

에서 DLL을 연결 :가 정적으로 고려이 상황 윈도우

나는 DLL 차례로, 다른 DLL에서 함수를 호출, (의이 dllA을 부르 자)를 만드는거야을 (의이 dllX, dllY 및 dllZ 부르 자) . 다른 사람이 dllA를 사용하고 싶다면 dllX, Y 및 Z도 필요합니다.

dllX, Y 및 Z의 필요한 기능이 dllA에 링크되도록 dllA를 빌드하는 방법이 있습니까? 이것이 올바른 용어인지는 모르겠지만 "정적으로 DLL을 링크하는 것"입니까?

간단한 해결책을 찾고 있습니다. 나는 dllX, Y 및 Z를 간단히 연결하고, 그러한 것이 존재한다면 dllA에 어떻게 든 추가하는 원유에 만족할 것입니다. 하지만이 쉬운 느낌이 없다는 느낌이 들었습니다.

저는 VS를 사용하는 Windows입니다.

감사합니다.

+0

모든 DLL의 소스 코드가 있습니까? –

답변

1

나는 너를 믿을 수 없다. 나는 그것이 행해진다고 들었습니다. 다른 DLL에 대한 빌드 액세스 권한이있는 경우 정적 라이브러리로 빌드하면 원하는대로 작동하지만 동적 라이브러리이라고하는 이유가 있습니다.

편집 : 그냥 찾았습니다 this thread.

5

정적으로 DLL을 연결할 수는 없으며 LIB 만 연결할 수 있습니다. DLL은 자체적으로 포함되며 정적 멤버와 DllMain로드/언로드 종속성을가집니다. 즉, 함수를 포함 할 수 없으며 다른 실행 파일에 링크 될 수 없습니다.

필요에 따라 적절한 dll을 모두 배포하는 설치 프로그램을 만들어야합니다.

정말 중요하다고 생각하고 앱 설치 프로그램에 의존 할 수 없다면 필요한 dll (A, X, Y 및 Z)을 리소스로 포함하고 런타임에 추출하여 디스크에 쓸 수있는 래퍼를 만들 수 있습니다 그런 다음 사용자 프로필 임시 폴더에서 추출 된 dllA를로드하고로드 된 dllA로 들어오는 모든 함수 호출을 연기합니다. 일부 sysinternals 도구는 비슷한 기술을 사용하여 x86 이미지에서 응용 프로그램의 x64 이미지를 추출하고 두 개의 별도 exe를 제공하지 않고 64 비트 프로세스로 다시 시작합니다.

0

기술적으로 DLL을 정적으로 연결할 수는 없지만 'Implicit linking'은 이에 해당합니다.

  1. 실행 파일에 __declspec (dllimport) 지정자를 사용하여 헤더 파일 선언을 포함시킵니다.
  2. DLL이 빌드 될 때 dll과 동일한 이름의 .lib이 DLL과 함께 생성되며 '가져 오기 라이브러리'라고합니다. 이 lib를 실행 파일에 연결하십시오.
  3. dll을 exe와 나란히 놓습니다.

그러면 Windows는 exe가 호출 될 때마다 DLL을로드하여 효과적으로 정적 라이브러리 역할을합니다.