2월, 2018의 게시물 표시

VC++2015 에서 vc140_xp의 내부 원리

Visual Studio 2015에서 C++프로젝트 플랫폼 도구 집합으로 vc140_xp을 사용했을 때, vc140에 비해 내부적으로 바뀌는 점들을 한번 분석(?) 해봤다. (완벽한 내용은 아닐 수 있다..)

1. Windows SDK을 XP를 지원하는 옛날 버전으로 변경.
  * VC Directories에서 Windows SDK의 include, lib, bin 폴더 경로를 변경
  * 원래 vc140이 v8.1 버전을 사용했다고 하면, vc140_xp로 플랫폼도구집합 변경 시, v7.1A를 사용하는 식으로 바뀜.
  * v7.1A는 xp를 지원함. (https://en.wikipedia.org/wiki/Microsoft_Windows_SDK)

2. CL 컴파일시 _USING_V110_SDK71_ 매크로를 정의함.
  * VC++의 라이브러리들 (ATL/MFC 라이브러리, C++표준라이브러리의 헤더파일들이 이 매크로에 영향을 받음.)
  * _USING_V110_SDK71_ 매크로가 큰 영향을 주진 않는다. (하지만, 조금이더라도 분명 영향을 미친다.)
  * 예를 들면, 이 매크로가 정의되어 있는 경우, C++표준라이브러리에서 std::shared_mutex 가 정의되지 않는다.

3. 링크시, /SUBSYSTEM:CONSOLE",5.01" (or 5.02) 옵션을 사용. (구성 형식이 EXE 일 경우)
  * vc140의 경우에는 /SUBSYSTEM:CONSOLE 옵션이 링크시 사용되는데, vc140_xp의 경우 /SUBSYSTEM:CONSOLE",5.01" 이 사용됨. (64bit에서는 5.01이 아니라 5.02)
  * 이 링크옵션은 완성된 PE파일의 서브시스템 버전에 영향을 줌.
  * 서브시스템 버전이 명시되지 않은 채로 링크되면, PE파일의 서브시스템이 6이상이 되고, 프로그램이 XP에서 실행되지 않음.
  * 구성 형식이 DLL일 경우도, /SUBSYSTEM:WINDOWS",5.01" 이 명령줄에 추가되긴 하지만…