제목이 짱 긴데.

 

정확히는

 

"Visual Studio 2017 이후 버전에서 MFCDirectX 9동시에 사용하려고 할 시" 발생하는 문제와, 해결법에 대한 내용입니다.

 

아니 요즘 세상에 아무리 그래도 DX9을 쓴다구요? 할 수도 있는데...

 

네 씁니다. 써요... 네...

 

 

* 해당 문제는 Visual Studio 2017 이후부터 발생합니다. 

 

 

일단, MFC를 사용하지 않고 그냥 DX9를 프로젝트에 임포트 했을때는 정상 작동하는것을 상정하고 이야기를 합니다.

 

MFC 프로젝트를 생성하고, pch.h나 framework.h에 d3d9.h, d3dx9.h를 인클루드 해주고 프로젝트를 빌드 돌리면,

 

정신이 아득해진다...

아마 이런 현상을 목격할 가능성이 큽니다.

 

이 문제는, (정확하진 않으나) 추측상, Windows 10 SDK에 기본 탑재되어있는 DX 10~12 버전과, 임의로 설치한 DX 9 버전간의 충돌로 인해 발생하는 문제로 보입니다.

 

뜬금없이 뭔 충돌이냐? 하겠습니다만... Visual Studio 최신버전, 특히 2019 (v142 MFC)를 사용하는 경우에는 기본 세팅이 Win 10 SDK 기반인지라... 아니 이게 충돌이 왜 나지? 싶은데 충돌이 나더라구요.

 

해결법은 의외로 간단했습니다.

 

* 해당 방식으로 해결이 되지 않는 경우, VS2015를 설치하신 뒤에 해당 버전에 동봉되는 SDK 8.1을 사용하시면 됩니다.

 

1. developer.microsoft.com/ko-kr/windows/downloads/sdk-archive/

 

Windows SDK 아카이브 - Windows 앱 개발

이 비보안 업데이트에는 품질 향상이 포함됩니다. MRMSupport.dll 로드 실패로 인해 개발자가 Windows 7에서 UWP 앱을 빌드하지 못하는 문제를 해결했습니다. MidlRT 및 MDMerge가 Windows 7에서 실행되지 않는

developer.microsoft.com

해당 링크에서 Win SDK 8.1 버전을 다운로드 합니다.

 

2. 설치합니다.

 

3. 원하는 프로젝트에서, 프로젝트 > 속성 > 일반 > Windows SDK 버전을 10.0 에서 8.1로 변경합니다.

 

 

 

이 부분을..
이렇게 바꾸면 됩니다.

 

 

 

SDK 버전을 낮추게 되면, 구문오류는 더이상 발생하지 않고 빌드가 성공하게 됩니다.

 

 

이랬던것이
"아무튼 실행됨" 상태로 바뀝니다.

하지만, 온갖 매크로 재정의 경고문구가 발생하는것으로 봐서는... 이 조차 문제가 발생할 여지가 있어 보입니다.

 

이는 문제 발생시 그때 대응하기로 했습니다... 일단은 경고문구에 나와있다시피 Win 8.1 SDK와 DX9 SDK 간의 충돌이니까요.

이전에 만들어 둔 프로젝트를 리빌딩 하다가 발견한것.

 

 

* 기본적으로 C++에서 현재 C++ 표준 버전을 확인하는건 이미 예약된 __cplusplus 매크로로 가능한것으로 알려져있다.

 

하지만 뭐가 문제인건지, Visual Studio에서 C++를 사용시, 현재 버전을 몇으로 설정하던 무조건 199711 (=C++98)로만 나온다.

 

검색해보니, 이것에 대한 원인은 못찾았고, 대신 해결방안을 찾았다.

 

https://docs.microsoft.com/en-us/cpp/build/reference/zc-cplusplus?view=vs-2019

 

/Zc:__cplusplus (Enable updated __cplusplus macro)

/Zc:__cplusplus (Enable updated __cplusplus macro) In this article --> The /Zc:__cplusplus compiler option enables the __cplusplus preprocessor macro to report an updated value for recent C++ language standards support. By default, Visual Studio always ret

docs.microsoft.com

해당 페이지에서처럼, /Zc:__cplusplus 명령어를 추가해주면, __cplusplus 매크로가 실제 버전에 맞게 잘 작동한다는 것이다.

 

자 그래서. 이걸 어디다 집어넣어야 하는가.

 

사용중인 Visual Studio가 한글버전이어서 살짝 헤멨는데, 이걸 검색해서 보는 분들은 조금이나마 덜 헤메시라고 남겨둔다.

 

 

1. 프로젝트 > 프로젝트 속성 클릭

맨 아래의 스패너모양을 누르면 된다.

 

2. 속성 > C/C++ > 명령줄 (=Commend Line)으로 이동.

 

3. 명령줄에 '/Zc:__cplusplus' 입력

그냥 뭐 이런식으로 집어넣으시고 적용누르시면 된다.

 

4. 체크

적용전

 

적용후 1 C++ 버전이 C++17로 인식되어 if문 아래의 구문이 활성화되었다.
적용후 2 C++ 버전을 14로 맞추었을때, C++14로 정상인식된다.

 

언젠가 좀 써먹을일이 있을거같아 기록해둔다.

'프로그래밍 > C/C++' 카테고리의 다른 글

포인터 변수 사용시 데이터 오염 문제  (0) 2020.11.28
Const 키워드.  (0) 2020.08.18
오늘의 실수.  (0) 2020.03.29
기록 #1  (0) 2020.01.18
Jsoncpp 라이브러리 사용 관련  (0) 2020.01.01

당연하게도 세팅을 위해서 라이브러리 추가를 해줘야 한다고 생각해서,

VS 프로젝트를 생성한 이후 추가메뉴를 찾다가 까먹어버린바람에...

'근데 얘들 기본 SDK로 들어왔으니까 있지 않을까?' 하고 바로 include를 시도해봤는데...

 

 

 

아니 이게 왜 다 있어?

 

DX10부터 12까지 다 있네요?

 

음...

 

아니 이러면 진짜 설치할 필요가 없었던거 아니었나? 

다이렉트 X 11의 경우 :

 

https://www.microsoft.com/en-us/download/details.aspx?id=6812

 

DirectX SDK - (June 2010)

Download the complete DirectX SDK, which contains the DirectX Runtime and all DirectX software required to create DirectX compliant applications.

www.microsoft.com

 

MS 공식홈페이지에서 DX11 sdk를 설치한다. (왜 2010년이 마지막인지는...)

 

그리고 Windows 10 SDK를 설치해줘야하는데...

 

 

Visual Studio 2017 이후 버전을 사용하시는 사용자들의 경우, 설치 옵션에서
'C++를 이용한 게임 개발' 을 활성화 하셨다면, 자동으로 Windows 10 SDK 까지 설치가 되어있을겁니다.

 

 

이 경우에는 추가적인 설치를 하실 필요는 없습니다만, SDK 가 설치되지 않았을 가능성이 있으니 해당 항목을 확인해줍니다.

 

 

 

 

 

 

 

 

 

 

 

 

 

...라고 기껏 써놨는데 검색해보니 Direct X 11.x 이후부터는 전부 Windows 10 SDK에 포함이라네요.

생각해보니 굳이 구버전 Direct X를 쓸 필요가 있긴 했나 싶긴 했습니다...

 

어쩐지 에러뜨더라...

 

역시 모르면 당해봐야 제맛

에러 해결법도 '최신 버전을 삭제하고 설치후 최신버전 재설치하세요' 라고 하니, 심각한 문제가 발생하기 전까지는 Windows 10 SDK에 탑재된 버전을 이용하는것으로 하겠습니다.

 

최신 버전 설치 및 사용 안내는 다음 링크를 참고바랍니다 :

https://docs.microsoft.com/ko-kr/windows/win32/direct3d12/directx-12-programming-environment-set-up

 

Direct3D 12 프로그래밍 환경 설정 - Win32 apps

생산성 높은 Direct3D 12 개발 환경을 구성하는 설치, 도구 및 지원되는 라이브러리를 설명합니다.

docs.microsoft.com

 

P.S : DX11.x

https://docs.microsoft.com/en-us/windows/win32/api/_direct3d11/

 

Direct3D 11 Graphics - Win32 apps

Direct3D 11 Graphics 01/11/2019 48 minutes to read In this article --> Overview of the Direct3D 11 Graphics technology. To develop Direct3D 11 Graphics, you need these headers: For programming guidance for this technology, see: Enumerations Functions Title

docs.microsoft.com

 

C++ 에서 json 양식 파일을 관리하기 위해 jsoncpp library를 가져오는 경우가 있다.

 

보통 사용을 위해서는 Readme에서 시키는대로 vcpkg를 설치하고, (* 설치보다는 복사에 가까운듯)

 

이후 명령어를 그대로 따라치면 되는데...

 

 

 

 

일단 첫 문장을 보면 알겠지만 해당 데이터는 git 을 통해서 획득해야한다.

 

git bash를 열어서

(이걸 캡쳐하는 상황에서는 이미 vcpkg가 탑재된 상태여서 해당 에러가 발생했다)

 해당 명령어를 입력해주면 된다.

 

이후 순서에 따라 설치를 진행하면 되는데..

 

Visual studio 설치시 아무 생각없이 설치한 경우에는 마지막 명령어를 입력하던 중 막히게 될것이다.

 

언제나 해답은 에러 로그 속에...

뭐 어찌되었든 설치가 실패했다. 같은 에러이다.

 

여기서 잘 보면, 중간 줄에 Warning: The following VS instances are excluded because the English language pack is unavailable.

라고 되어있는데...

 

그렇다. 영어 언어팩 설치하라는 소리다.

 

해결법은 간단하다.

 

그냥 Visual studio installer를 실행해서, 영어 언어팩을 설치해주면 된다.

 

(각자의 환경에 따라 화면 구성이 다를 수 있음)

 

영어 언어팩을 체크하고 수정을 누르면 알아서 다운로드 및 설치를 진행한다.

 

언어팩이 정상적으로 설치된 뒤, 다시 jsoncpp 라이브러리 설치를 시도하면,

 

이와같이 정상적으로 설치되는것을 확인할 수 있다.

 

이제 필요한 헤더를 불러와서 사용하면 끝.

 

 

 

사실 되게 별거 아닌 문제인데, 어제 해보려다가 언어팩을 설치하라는 얘기를 제대로 못알아먹고 헤메어서 기록차원에서 작성해둔다...

'프로그래밍 > C/C++' 카테고리의 다른 글

포인터 변수 사용시 데이터 오염 문제  (0) 2020.11.28
Const 키워드.  (0) 2020.08.18
오늘의 실수.  (0) 2020.03.29
Visual C++에서 C++ 버전확인하는 방법.  (3) 2020.02.27
기록 #1  (0) 2020.01.18

+ Recent posts