Visual Studio 2022 - Windows XP / 2003용 C/C++ 프로젝트 빌드
Visual Studio 2022에서 기본 C/C++ 프로젝트를 생성한 다음,
#include <iostream>
int main()
{
std::cout << "Hello World!\n";
}
빌드한 결과물을 Windows XP / 2003에서 실행하면 이런 오류가 발생합니다.
C:\temp\xptest.exe is not a valid Win32 application.
이 문제를 해결하려면, XP용으로 빌드하도록 설정해야 하는데요, 이를 위해 우선 Visual Studio 측에 다음의 구성 요소를 설치해야 합니다.
["Tools" / "Get Tools and Features..." 메뉴]
"Individual components" 탭 / "Compilers, build tools, and runtimes" 카테고리 - "C++ Windows XP Support for VS 2017 (v141) tools [Deprecated]"
이후, C++ 프로젝트 속성창에 들어가 "Properties" / "General" / "Platform Toolset"을 "Visual Studio 2017 - Windows XP (v141_xp)"로 변경하면 됩니다. (참고로, 이렇게 변경하면 Windows SDK Version도 자동으로 "7.0"으로 바뀝니다.)
끝입니다. 이제 빌드하고 다시 실행하면 XP/2003에서도 정상적으로 실행됩니다.
경우에 따라 XP/2003에서 실행 시 이런 오류가 발생할 수 있습니다.
xptest.exe - Unable To Locate Component
This application has failed to start because MSVCP140.dll was not found. Re-installing the application may fix this problem.
전에 한 번 언급했지만, 이것은 재배포 런타임("Microsoft Visual C++ 2015 Redistributable Update 3")을 설치하면 됩니다.
VCRUNTIME140.dll, MSVCP140.dll, VCRUNTIME140.dll, VCRUNTIME140_1.dll이 없어 exe 실행이 안 되는 경우
; https://www.sysnet.pe.kr/2/0/12714
위와 같은 문제를 겪지 않기 위해, "MSVCP140.dll" 의존성을 갖지 않도록 C/C++ / "Code Generation" 범주의 "Runtime Library" 값을 "Multi-threaded (/MT)"로 설정할 수 있습니다.
재미있는 건, 이렇게 설정한 프로젝트를 Visual Studio 2022에서 빌드하면 문제가 없는데, 2019에서 빌드하면 XP/200에서 실행 시 이런 오류가 발생합니다.
xptest.exe - Entry Point Not Found
The procedure entry point InitializeCriticalSectionEx could not be located in the dynamic link library KERNEL32.dll.
이것 역시
전에 언급한 것처럼, CRT 라이브러리가 더 이상 XP/2003을 지원하지 않으면서 발생한 변화였는데요, 웬일인지 동일한 프로젝트를 Visual Studio 2019에서 빌드하면 InitializeCriticalSectionEx를 사용하는 PE 파일을 생성하게 됩니다.
// Visual Studio 2019 + /MT 옵션으로 빌드한 경우,
c:\temp> dumpbin /IMPORTS xptest.exe
Microsoft (R) COFF/PE Dumper Version 14.41.34120.0
Copyright (C) Microsoft Corporation. All rights reserved.
Dump of file xptest.exe
File Type: EXECUTABLE IMAGE
Section contains the following imports:
KERNEL32.dll
41A000 Import Address Table
426230 Import Name Table
0 time date stamp
0 Index of first forwarder reference
EA EncodePointer
CA DecodePointer
EE EnterCriticalSection
339 LeaveCriticalSection
2E4 InitializeCriticalSectionEx
D1 DeleteCriticalSection
367 MultiByteToWideChar
511 WideCharToMultiByte
32C LCMapStringEx
// ...[생략]...
반면, Visual Studio 2022에서 동일한 프로젝트를 빌드하면 InitializeCriticalSectionEx를 사용하지 않는 PE 파일을 생성합니다.
// Visual Studio 2022 + /MT 옵션으로 빌드한 경우,
// (아마도 Visual Studio 2022용 빌드 도구에서도 가능하긴 할 것입니다.)
c:\temp> dumpbin /IMPORTS xptest.exe
Microsoft (R) COFF/PE Dumper Version 14.41.34120.0
Copyright (C) Microsoft Corporation. All rights reserved.
Dump of file xptest.exe
File Type: EXECUTABLE IMAGE
Section contains the following imports:
KERNEL32.dll
41B000 Import Address Table
429408 Import Name Table
0 time date stamp
0 Index of first forwarder reference
202 GetLastError
511 WideCharToMultiByte
473 SetLastError
2E3 InitializeCriticalSectionAndSpinCount
4BC SwitchToThread
4C5 TlsAlloc
4C7 TlsGetValue
4C8 TlsSetValue
4C6 TlsFree
// ...[생략]...
따라서 만약 2019 버전으로 빌드해야 한다면 반드시 "Multi-threaded DLL (/MD)" 옵션으로 빌드해야 합니다.
(그렇긴 한데, 설마 요즘에도 XP/2003을 쓰고 있는 환경은 없겠죠? ^^;)
[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]