Visual C ++ 2015 및 OpenGL로 게임을 만들었습니다. 내 컴퓨터에서 실행하면 문제가 없었지만 다른 컴퓨터에서 실행하면 일부 DLL이 누락되었음을 나타냅니다. 다음에 발생하지 않도록하는 방법과 파일 누락 문제를 피할 수 있도록 고려해야 할 사항을 알고 싶습니다.
Visual C ++ 2015 및 OpenGL로 게임을 만들었습니다. 내 컴퓨터에서 실행하면 문제가 없었지만 다른 컴퓨터에서 실행하면 일부 DLL이 누락되었음을 나타냅니다. 다음에 발생하지 않도록하는 방법과 파일 누락 문제를 피할 수 있도록 고려해야 할 사항을 알고 싶습니다.
답변:
https://www.microsoft.com/en-us/download/details.aspx?id=48145와 같이 실행 파일을 실행하려는 컴퓨터에서 사용한 Visual Studio 버전의 재배포 가능 파일을 설치해야합니다. for VS2015) . DirectX 또는 기타 구성 요소에 대한 수정자가 필요할 수도 있습니다.
응용 프로그램 설치 관리자는 일반적으로 모든 재배포 가능 항목을 모든 종속성에 설치합니다. InnoSetup, NSIS, WIX 또는 기타 다양한 도구를 사용하여 이러한 설치 관리자를 만들 수 있습니다.
재배포 가능 파일이 필요없는 실행 파일을 만들 수는 있지만 핵심 Windows 기능의 하위 집합으로 제한되므로 일반적으로 의미있는 게임이나 대규모 응용 프로그램을 만들기에는 충분하지 않습니다. 설치 프로그램 자체는 종속성을 실행할 필요가없는 응용 프로그램의 예입니다.
MSVCRT.DLL
대신 (윈도우 자체에 포함) MSVCPxxx.DLL
(Visual Studio를 릴리스에 포함 된 버전 특정 버전).
내가 사용 종속성 워커 DLL의 누락 추적하기 :
Dependency Walker는 또한 모듈로드 및 실행과 관련된 시스템 오류 문제 해결에 매우 유용합니다. Dependency Walker는 모듈 누락, 잘못된 모듈, 가져 오기 / 내보내기 불일치, 순환 종속성 오류, 일치하지 않는 시스템 유형의 모듈 및 모듈 초기화 실패와 같은 많은 일반적인 응용 프로그램 문제를 감지합니다.
VS에는 DLL 을 정적으로 연결 하는 컴파일 타임 옵션도 있습니다 .
Visual C ++의 경우 재배포를 처리하는 방법 중 몇 가지를 선택할 수 있습니다. 설치 관리자에서 EXE를 실행하고 (관리자 권한으로) MSI 설치 관리자와 함께 MSM 병합 모듈을 사용하거나 심지어 병렬 DLL을 사용하십시오. MSDN 참조 을 하십시오.
더 큰 문제는 OpenGL입니다. Windows에 포함 된 OpenGL의 유일한 버전은 OpenGL 1.5 소프트웨어 렌더러입니다. 다른 제품을 사용하려면 타사 ICD를 설치해야합니다.
이것이 많은 Windows 게임이 운영 체제에 포함되어 있기 때문에 대신 DirectX를 사용하는 이유 중 하나입니다. 게임 개발자를위한 Direct3D 11 배포 및 직접 설치 아님 을 참조하십시오 .
면책 조항 :이 인 해결 방법 이 아닌 솔루션 여전히 대답하지만, 매우 실용적 가능성.
VS 자체의 종속성이 없지만 자체 단점이 있음을 절대로 확신하려면 코드 생성 설정에서 MT (Multi Threaded) / MD (Multi Threaded Debug) (디버그 빌드의 경우)를 사용하도록 선택할 수 있습니다 ) 대신 MT DLL (MTd) / MT 디버그 DLL (MDd) 대신.
단점은 무엇입니까?
그리고 전문가는 무엇입니까?
이 링크를 확인보다 자세한 설명과 정적 런타임 사용시 발생할 수있는 함정에 대해서는 를 .
또 다른 해결 방법 은 모든 필요한 DLL을 바이너리가있는 곳에 두는 것입니다. 응용 프로그램은 (런타임 라이브러리에 대한) 업데이트의 이점을 얻지 못하지만 그게 전부입니다.
실제 솔루션은 응용 프로그램을 릴리스 / 비 디버그 dll 모드 (MTd)로 배포하고 올바른 VC ++ 재배포 가능 설치 프로그램 (및 OpenAL, DirectX9, PhysX와 같이 사용할 수있는 다른 라이브러리 설치 프로그램)을 제공하고 사용자가이를 실행할 수 있도록하는 것입니다. 다른 답변이 지적한 것처럼 응용 프로그램을 실행하기 전에.
또한 GPU 드라이버를 업데이트해야 할 수도 있음을 사용자에게 알려주십시오 (예 : OpenGL, Vulcan과 같은 여러 응용 프로그램에 대해 여러 런타임이 포함되어 있기 때문에).