"DLL 누락"문제를 어떻게 제거 할 수 있습니까?


15

Visual C ++ 2015 및 OpenGL로 게임을 만들었습니다. 내 컴퓨터에서 실행하면 문제가 없었지만 다른 컴퓨터에서 실행하면 일부 DLL이 누락되었음을 나타냅니다. 다음에 발생하지 않도록하는 방법과 파일 누락 문제를 피할 수 있도록 고려해야 할 사항을 알고 싶습니다.


8
먼저 릴리스 버전을 빌드하고 있는지 확인하십시오.
user253751

3
VS 자체의 종속성이 없지만 고유 한 단점이 있음을 절대로 확신하려면 코드 생성 설정에서 MT DLL / MT 디버그 DLL . 실행 파일 크기가 커지고이 방법으로 컴파일 된 바이너리는 런타임 dll 업데이트의 이점을 얻지 못합니다. 그러나 그것은 당신에게 달려 있습니다. 실행 파일에 "외부"종속성이 없다는 장점도 있습니다. 이것은 아니기 때문에 나는 대답으로이 게시하지 않습니다 솔루션 문제, 바로 해결한다.
기즈모

@Gizmo 해결 방법은 여전히 ​​답변이며 의견은 일시적이며 게시물을 명확하게하는 데 사용되며 삭제 될 수 있습니다. 유용한 경우 답으로 게시해야합니다.
user1306322

흠. 그때 답변으로 게시하겠습니다.
기즈모

답변:


22

https://www.microsoft.com/en-us/download/details.aspx?id=48145와 같이 실행 파일을 실행하려는 컴퓨터에서 사용한 Visual Studio 버전의 재배포 가능 파일을 설치해야합니다. for VS2015) . DirectX 또는 기타 구성 요소에 대한 수정자가 필요할 수도 있습니다.

응용 프로그램 설치 관리자는 일반적으로 모든 재배포 가능 항목을 모든 종속성에 설치합니다. InnoSetup, NSIS, WIX 또는 기타 다양한 도구를 사용하여 이러한 설치 관리자를 만들 수 있습니다.

재배포 가능 파일이 필요없는 실행 파일을 만들 수는 있지만 핵심 Windows 기능의 하위 집합으로 제한되므로 일반적으로 의미있는 게임이나 대규모 응용 프로그램을 만들기에는 충분하지 않습니다. 설치 프로그램 자체는 종속성을 실행할 필요가없는 응용 프로그램의 예입니다.


VS를 사용하여 이러한 설치 프로그램을 빌드 할 수 있습니까? 프로젝트 설정에서 OneClick이라는 것을 본 적이 있다고 생각했습니다.
user1306322

@ user1306322 : 절대적으로 하나의 솔루션이 Gizmo의 질문 의견에 언급되었습니다. 어떤 런타임 / DLL을 연결 하느냐의 문제입니다. 기본 설정을 사용하면 버전 별 CRT DLL에 연결할 수 있지만 링커 옵션에서 변경하여 변경할 수 있습니다. 에 대한 그냥 링크 MSVCRT.DLL대신 (윈도우 자체에 포함) MSVCPxxx.DLL(Visual Studio를 릴리스에 포함 된 버전 특정 버전).
Sean Middleditch

또는 완전한 설치 프로그램을 빌드하려는 경우 기본적으로 WIX 입니다. 일반적으로 복잡한 XML을 많이 사용하는 Microsoft crapfest이지만 작동합니다. 2013 년이나 2015 년 이후로 사라 졌다고 생각하지만 "설치 프로젝트"도있었습니다.
Sean Middleditch

7

내가 사용 종속성 워커 DLL의 누락 추적하기 :

Dependency Walker는 또한 모듈로드 및 실행과 관련된 시스템 오류 문제 해결에 매우 유용합니다. Dependency Walker는 모듈 누락, 잘못된 모듈, 가져 오기 / 내보내기 불일치, 순환 종속성 오류, 일치하지 않는 시스템 유형의 모듈 및 모듈 초기화 실패와 같은 많은 일반적인 응용 프로그램 문제를 감지합니다.


VS에는 DLL 을 정적으로 연결 하는 컴파일 타임 옵션도 있습니다 .

  • 정적으로 연결한다는 것은 DLL이 EXE 파일에 포함되어 있음을 의미합니다.
  • 정적으로 연결하면 EXE 파일의 크기가 증가합니다.
  • 정적으로 연결한다는 것은이 버전의 DLL이 항상 사용됨을 의미합니다.
  • 그러나 정적으로 연결한다는 것은 누락 된 DLL에 문제가 없다는 것을 의미합니다.

1
의존성 워커는 꽤 오래되었습니다. 더 이상 DLL을로드하는 Windows의 메커니즘을 올바르게 에뮬레이션하지 않습니다. DLL을 찾을 수 없다는 잘못된 메시지로 이어 지기도합니다.
jpmc26

그리고 의존 라이센스에 따라 정적 링크가 금지 될 수 있습니다.
KeyWeeUsr

6

Visual C ++의 경우 재배포를 처리하는 방법 중 몇 가지를 선택할 수 있습니다. 설치 관리자에서 EXE를 실행하고 (관리자 권한으로) MSI 설치 관리자와 함께 MSM 병합 모듈을 사용하거나 심지어 병렬 DLL을 사용하십시오. MSDN 참조 을 하십시오.

더 큰 문제는 OpenGL입니다. Windows에 포함 된 OpenGL의 유일한 버전은 OpenGL 1.5 소프트웨어 렌더러입니다. 다른 제품을 사용하려면 타사 ICD를 설치해야합니다.

이것이 많은 Windows 게임이 운영 체제에 포함되어 있기 때문에 대신 DirectX를 사용하는 이유 중 하나입니다. 게임 개발자를위한 Direct3D 11 배포직접 설치 아님 참조하십시오 .


1
OpenGL 조언은 구식입니다. 모든 최신 그래픽 드라이버에는 최신 OpenGL ICD가 제공됩니다.
user253751

필자는 개인적으로 1 년 전의 작은 컴퓨터에 openGL DLL을 설치해야했습니다
Gnemlock

@Gnemlock 해당 컴퓨터에 Windows를 다시 설치 한 직후에 귀하가 옳을 수도 있습니다. NVIDIA, AMD 또는 Intel의 공식 드라이버 패키지를 설치 한 후에도이 문제가 계속 발생 했습니까?
데미안 예릭

2
@Gnemlock-OpenGL DLL을 수동으로 설치하는 경우 뭔가 끔찍한 일이 있습니다. 실제로 "GPU 벤더 드라이버 설치"를 의미한다면 바로 immibis가 말한 것입니다.
Maximus Minimus

@Gnemlock-아, 그럼 현실 세계와 관련이 없습니다. 정리해 주셔서 감사합니다.
Maximus Minimus

1

면책 조항 :이 인 해결 방법 이 아닌 솔루션 여전히 대답하지만, 매우 실용적 가능성.

VS 자체의 종속성이 없지만 자체 단점이 있음을 절대로 확신하려면 코드 생성 설정에서 MT (Multi Threaded) / MD (Multi Threaded Debug) (디버그 빌드의 경우)를 사용하도록 선택할 수 있습니다 ) 대신 MT DLL (MTd) / MT 디버그 DLL (MDd) 대신.

여기에 이미지 설명을 입력하십시오

단점은 무엇입니까?

  • 실행 파일 크기와 바이너리를 증가시킵니다 (게임을하는 경우 무시할 수는 있지만)
  • 이 방법으로 컴파일하면 런타임 dll 업데이트의 이점이 없습니다. (예를 들어 Microsoft가 VC ++ 2015 SP2, SP3, SP4 등을 출시하는 경우). 그러나 그것은 당신에게 달려 있습니다.
  • 기존 /로드 된 코드 (DLL)를 재사용하지 않기 때문에 더 많은 RAM 사용 (또한 무시할 수있는)
  • 링크하는 모든 라이브러리가 동일한 런타임에 대해 컴파일되었는지 확인해야합니다. 그렇지 않으면 링크가 실패하거나 흥미로운 런타임 오류가 발생할 수 있습니다 (아마도 그렇지는 않지만 업데이트 된 레거시 프로젝트에서 일생에 한 번 발생했습니다) 최신 VS)

그리고 전문가는 무엇입니까?

  • 실행 파일에는 VS 자체의 "외부"종속성이 없습니다 (msvc * .dll 요구 사항 없음).
  • 일부 사람들은 DLL 호출 오버 헤드를 제거하기 때문에이를 성능 향상으로보고 있습니다. 이론적으로는 사실이지만 실제로는 개선이 미미합니다.

이 링크를 확인보다 자세한 설명과 정적 런타임 사용시 발생할 수있는 함정에 대해서는 를 .

또 다른 해결 방법 은 모든 필요한 DLL을 바이너리가있는 곳에 두는 것입니다. 응용 프로그램은 (런타임 라이브러리에 대한) 업데이트의 이점을 얻지 못하지만 그게 전부입니다.

실제 솔루션은 응용 프로그램을 릴리스 / 비 디버그 dll 모드 (MTd)로 배포하고 올바른 VC ++ 재배포 가능 설치 프로그램 (및 OpenAL, DirectX9, PhysX와 같이 사용할 수있는 다른 라이브러리 설치 프로그램)을 제공하고 사용자가이를 실행할 수 있도록하는 것입니다. 다른 답변이 지적한 것처럼 응용 프로그램을 실행하기 전에.

또한 GPU 드라이버를 업데이트해야 할 수도 있음을 사용자에게 알려주십시오 (예 : OpenGL, Vulcan과 같은 여러 응용 프로그램에 대해 여러 런타임이 포함되어 있기 때문에).


0

내 해결책은 Visual Studio에서 .sln 파일이있는 폴더에 오류를 일으킨 DLL을 복사하여 붙여 넣는 것입니다. #include섹션 후 , 나는 그것을 작성 #pragma comment (lib, "lost DLL name with .dll")하고 해결했습니다!

참고 : 타사 라이브러리 (vulkan api) DLL에서 발생하는 문제를 해결했습니다. 어쩌면 그것은 알려지지 않았지만 90 %가 행운을 빕니다 :)

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.