VS2015로 빌드한 응용 프로그램을 윈도우 임베디드에 배포할 때 문제
요 며칠 동안 VS2015, 정확히는 VC++14로 빌드한 응용 프로그램을 윈도우 7 임베디드에 배포하면서 겪은 문제 때문에 적어 본다.
VS2015에서는 C 런타임에 많은 변화가 있다. 자세히 읽어 보진 않았지만 간단히 얘기하면 윈도우 플랫폼에 따라 각각 구현해야 했던 C 런타임을 다음 세 가지로 정리하고 통합한다는 거다.
- VCRuntime (vcruntime140.dll)
- AppCRT (appcrt140.dll)
- DesktopCRT (desktopcrt140.dll)
자세한 설명은 The Great C Runtime (CRT) Refactoring을 참고하자.
일반적으로 VC++로 빌드한 응용 프로그램은 그에 해당하는 VC++ 재배포 패키지를 설치하면 문제가 없지만 현재 윈도우 7 임베디드에서는 이것만으로 해결할 수 없다. 재배포 패키지를 설치하는 과정에서 오류가 발생하며 이 상태에서 응용 프로그램을 실챙하면 api-ms-win-crt-runtime-l1-1-0.dll을 찾을 수 없다는 메시지 창이 뜬다. 이 파일은 유니버설 C 런타임(CRT) 파일 중 하나이며 VS2015에서 윈도우 10 SDK를 이용해 빌드할 때 의존성이 생긴다고 한다. 하지만 SDK 버전 8.1로 빌드하더라도 이 파일에 대한 의존성이 생긴다.
유니버설 C 런타임은 윈도우 10에는 기본 탑재, 그 외 O/S에는 KB2999226 업데이트로 제공하며 윈도우 업데이트를 통해 제공할 예정이지만 아직 업데이트 목록에서 볼 수 없다. VS2015용 C++ 재배포 패키지를 설치하면 KB2999226을 함께 설치하는데, 문제는 현재 윈도우 7 임베디드에서는 이를 적용할 수 없기 때문에 생긴다. 즉 재배포 패키지 설치 과정에서 발생하는 오류는 KB2999226을 설치하지 못하기 때문에 생긴다. 이 업데이트를 직접 적용하면 별 다른 오류 메시지는 없으나 설치하지 못하며, MSU 패키지 압축을 해제한 후 WUSA를 이용해 직접 적용해 보면 ‘해당 O/S에 적용할 수 없다’는 오류 메시지를 볼 수 있다.
따라서 현재 남은 방법은 필요한 파일을 직접 넣어 배포하는 것 뿐이며 다음 과정을 따른다.
- VS2015용 C++ 재배포 패키지를 설치한다.
- C:\Program Files\Windows Kits\10\Redist\ucrt에서 해당하는 O/S에 맞는 파일을 함께 배포한다.
참고로 유니버설 C 런타임은 원래 system32 디렉터리에 위치하지만 해당 응용 프로그램이 찾을 수 있는 경로에만 존재하면 된다.
마지막으로 아직 정확히 검증한 내용은 아니지만 한 가지 더 적어 본다. 배포 대상 O/S는 앞에서 적은 것처럼 윈도우 7 임베디드 스탠다드 x86이다. 내가 사용 중인 O/S는 윈도우 7 x64이며, C:\Program Files (x86)\Windows Kits\10\Redist\ucrt\DLLs\x86에서 수집한 파일을 함께 배포했지만 정상 실행하지 않았다. 그런데 윈도우 7 x86 PC에서 마찬가지로 수집한 x86용 런타임을 함께 배포하니 정상 실행했다. 내 PC에 파일이 잘못 설치된 것인지 아직은 확인하기 어려우므로 일반화 오류일 수도 있지만 참고로 적어 본다.