[C++] Visual Studio 2015 명령줄에서 XP 타겟 사용하기

Visual Studio 2012부터 XP 타겟을 사용하기 위해서는 툴체인을 XP가 들어간 것을 선택해야 한다. Visual Studio 2015는 v140_xp를 선택하면 된다. IDE에서는 그렇게 사용하면 되는데 명령 프롬프트에서 직접 빌드 해야 할때에는 어떻게 해야 할까? 컴파일러에 주는 뭔가 옵션이 있는 것일까, 아니면 CRT 라이브러리를 다른걸 선택하면 되는건가, 라는 여러가지 의문이 생긴다. 당황하지 않게 어떡하는지 살펴보도록 하자.

우선 Visual Studio 2012부터 생긴 XP 타겟이 해주는 역할은 크게 두 가지다. 1) XP 호환되는 플랫폼 SDK를 사용해서 컴파일한다. 7.1A 버전이 마지막 호환되는 SDK다. 2) XP 호환되는 플랫폼 SDK를 사용해서 링크한다. 마찬가지로 7.1A에 포함된 라이브러리를 말한다. 3) 링크 옵션으로 실행 가능한 운영체체를 XP 버전으로 지정한다. 이걸 하지 않으면 6.0으로 선택되서 Vista부터 실행 가능한 이미지가 생성된다.

XP 타겟이 하는 일을 알았으니 결론은 간단하다. 1은 cl에다 옵션을 주면 되는 것이고, 2, 3은 link에다 옵션을 추가하면 된다. 이미 만들어진 빌드 스크립트를 사용한다면 빌드 옵션을 조정하는 것도 일이기 때문에 환경 변수를 이용하면 편리하다.

cl에 추가되는 옵션을 조정하기 위해서는 아래 환경 변수를 추가하면 된다.

set INCLUDE=%ProgramFiles(x86)%\Microsoft SDKs\Windows\7.1A\Include;%INCLUDE%
set PATH=%ProgramFiles(x86)%\Microsoft SDKs\Windows\7.1A\Bin;%PATH%

link에 사용되는 라이브러리를 변경하기 위해서는 아래 환경 변수를 추가하면 된다. 32비트 빌드라면 아래 환경 변수를 추가하면 된다.

set LIB=%ProgramFiles(x86)%\Microsoft SDKs\Windows\7.1A\Lib;%LIB%

64비트라면 아래 환경 변수를 추가한다.

set LIB=%ProgramFiles(x86)%\Microsoft SDKs\Windows\7.1A\Lib\x64;%LIB%

32비트 콘솔 프로그램을 빌드하면 아래와 같이 환경 변수를 추가한다. 윈도우 프로그램이라면 subsystem을 windows로 지정하면 된다.

set LINK=/SUBSYSTEM:CONSOLE,5.01 %LINK%

64비트 콘솔 프로그램을 빌드하면 아래와 같이 추가하면 된다.

set LINK=/SUBSYSTEM:CONSOLE,5.02 %LINK%

그런데 여기까지 하고 나면 함정이 하나 있다. Visual Studio 2015는 과거 버전이 그랬던것처럼 빌드 가능한 명령 프롬프트를 시작 메뉴에 등록하지 않는다는 점이다. 어디서 빌드를 시작해야 난감해진다. 당황할 필요 없다. 배치 파일은 동일한 경로에 있다. 아래와 같이 실행하면 각각 32비트 64비트 빌드 환경으로 진입할 수 있다.

C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat x86
C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat amd64

전체적인 메커니즘에 대해서 더 궁금한 분은 여기 글을 참고하도록 하자. 해당 글을 보면 CL 옵션으로 _USING_V110_SDK71_ 매크로 정의를 추가하는 것을 볼 수 있는데 그건 잘못된 SDK가 빌드되는 것을 막기 위한 용도로 현재는 사용되지 않는다.