글

라벨이 Visual Studio인 게시물 표시

[Cocos2d-x] error MSB8036: The Windows SDK version 8.1 was not found.

이미지
비주얼 스튜디오 2017에서 cocos2d-x 3.16 프로젝트를 생성 후 빌드하는 과정에서 아래와 같은 에러가 발생했습니다. error MSB8036: The Windows SDK version 8.1 was not found. Install the required version of Windows SDK or change the SDK version in the project property pages or by right-clicking the solution and selecting "Retarget solution". 예전에도 비슷한 에러들이 2건 있었죠. Visual Studio 2012 error MSB8020: The builds tools for Visual Studio 2010 (Platform Toolset = 'v100') cannot be found Error MSB3774 Could not find SDK "WindowsMobile, Version=10.0.10240.0" 아무튼 에러가 libSpine, libcocos2d, 그리고 만든 프로젝트 총 3개의 프로젝트에서 발생했습니다. 에러 설명에 나온데로 이슈가 발생한 프로젝트에 마우스 우클릭 - Retarget Projects를 선택 후 아래와 같이 Retarget Projects 창이 나오면 기본 설치되어 있고 선택된 Windows SDK Version(10.0.16299.0)을 선택 해주면 됩니다. 어쩐지 libbox2d, librecast는 에러가 발생안하던데 이놈들은 sln 파일 최초 오픈시 아예 물어봐주더군요.

Visual Studio 2017 영문 언어팩 설치 및 적용

이미지
비주얼 스튜디오 2017 커뮤니티 에디션을 사용중에 있는데, 기본 한글로 설치가 된 상태입니다. 이전 버전인 비주얼 스튜디오 2015에서는 도구 - 옵션 - 환경 - 국가별 설정에서  추가 언어 가져오기 라는 메뉴가 있었는데 2017에서는 위와같이 보이지 않네요. Visual Studio Installer을 사용해서 언어팩을 설치해줘야 하네요. Windows 검색 창에서 visual 만 입력해줘도 Visual Studio Installer을 찾을 수 있습니다. 실행하면 위와 같은 화면이 나옵니다. 업데이트 항목이 업데이트를 거치면 수정으로 보이는데, 업데이트 후 수정을 진행하셔도 되고 자세히 - 수정을 눌러 진행하셔도 됩니다. 수정 중 창에서 3번째 언어 팩 탭으로 간 후 영어를 체크 후 오른쪽 하단의 수정 버튼을 클릭해서 설치해줍니다. 비주얼 스튜디오 2017을 다시 실행해서 도구 - 옵션 - 환경 - 국가별 설정에서 언어를 English로 변경 적용합니다. 비주얼 스튜디오 재시작 후 변경 사항이 적용된 것을 확인할 수 있습니다. 다음에 설치할 때 옵션이 있는지 체크해서 아예 영문으로 설치를 해야겠네요.

Visual Studio 2008에서 2015로 마이그레이션 중 발생한 이슈들 정리

비주얼 스튜디오 2008로 된 프로젝트들을 비주얼 스튜디오 2015로 마이그레이션 하면서 나왔던 이슈들을 목록으로 정리해봤습니다. 전체적으로 비주얼 스튜디오 2015가 2008보다 좀더 엄격히? 표준을 지키려고 하고 있기 때문에 발생한 에러가 많았으며, 어떤 에러는 프로젝트에 따라 다를 수 있다는 점 미리 말씀드립니다. 아래 모든 링크는 제 블로그에 각각 정리한 것들입니다. 컴파일 에러 C2275 'std::string' 와 C2228 '.npos' C2668 'abs': 오버로드된 함수에 대한 호출이 모호합니다. C2039 'list': 'std'의 멤버가 아닙니다. C2039 'copy_exception': 'std'의 멤버가 아닙니다. 비주얼 스튜디오 2015에서 각종(C3861, C2660, C2039, C2065) CRT 컴파일 에러 C3861 '_Pow_int': 식별자를 찾을 수 없습니다. C2694 'Child::~Child(void) throw(Error)': 재정의 가상 함수에 지정된 예외가 기본 클래스 가상 멤버 함수 'Base::~Base(void)'보다 덜 제한적입니다. C2338 is deprecated and will be REMOVED. Please use . You can define _SILENCE_STDEXT_HASH_DEPRECATION_WARNINGS to acknowledge that you have received this warning. C2382 'ClassA::~ClassA': 재정의. 예외 사양이 다릅니다. C2664 'std::pair<unsigned long,unsigned long> std::make_pair<DWORD,DWORD>(_Ty1 &&,_Ty2 &&)...

pdb 프로그램 데이터베이스를 쓰는 동안 오류가 발생했습니다. 디스크 공간이 부족한지, 경로가 잘못되었는지 또는 권한이 없는지 확인하십시오.

프로젝트를 빌드 중에 아래와 같은 에러가 발생했습니다. fatal error LNK1201 'xxx. pdb' 프로그램 데이터베이스를 쓰는 동안 오류가 발생했습니다. 디스크 공간이 부족한지, 경로가 잘못되었는지 또는 권한이 없는지 확인하십시오. 비슷한 에러가 비주얼 스튜디오 2003을 윈도우7에서 사용하면서 발생했던 이슈 에서도 있었지만, 이번에는 다른 문제가 원인이었습니다. 원인은 바로 출력 디렉토리와 출력 파일이 달라져서 발생했습니다. 기존에는 아래와 같이 되어 있었다면, 출력 디렉토리 ../../../../BIN 출력 파일 $(OutDir)/$(SolutionName)$(ConfigurationName).exe 커밋된 내용을 업데이트 받으면서 아래와 같이 임의로 변경이 되면서 기존과 달라져서 pdb 파일을 찾지 못해 에러가 발생했습니다. 출력 디렉토리 D:\myproject\ 출력 파일 D:\myproject\myproject_debug.exe 해결은 기존과 같이 내용을 수정해주면 됩니다.

디버깅시 브레이크 포인트 걸렸을 때 인풋 렉 발생

이미지
비주얼 스튜디오 2008에서 2015로 마이그레이션 중 아래와 같은 에러가 있었습니다. 디버깅시 브레이크 포인트가 걸리면 비주얼 스튜디오 자체에 렉이 걸리더군요. 키보드든 마우스든 모든 입력이 렉이 걸렸습니다. 마치 아래 영상과 비슷한 느낌이었습니다. 이것저것 구글링을 해보고 시도를 해봤습니다. 비주얼 스튜디오 퍼포먼스 트윅. 각종 옵션 변경 visual studio 클린 재설치 - Visual Studio Uninstaller 디버깅중 응답 지연 방지(Preventing Response Delays During Debugging) 디버깅중 극단적인 비주얼 스튜디오 렉. dx input cooperative 관련 위와 같은 것들을 모두 시도해 봤지만 어떤것도 문제를 해결해주지는 않았습니다. 하지만 좀만 더 파보니 원인은 dx input과의 충돌이라는게 밝혀졌습니다. dx input의 acquire를 통해서 인풋 장비를 얻어오면 렉이 걸리고 얻어오지 않으면 렉이 없더군요. //foo.cpp int dx_input_lag_func() {    acquire(false);    ...    ...//break point    ...    ...    acquire(ture); } 대략 위와 같이 브레이크 걸리기전에 acquire(false)로 해주고 디버깅 끝나는 부분에 다시 acquire(true)를 해주는 식으로 테스트를 해봤습니다. 하지만 이것은 디버깅 할 때마다 소스를 이렇게 수정해서 하는 것은 근본적인 해결책이 아니기 때문에 다른 해결책이 필요했습니다. 제가 생각한 해결 방안은 릴리즈는 기존대로 dxinput을 사용하고 디버그시에만 GetAsyncKeyState등을 사용해서 처리하도록 하는 방안이었습니다. 그래서 아답터 패턴을 도입하고 아래와 같은 것들을 처리했습니다. ...

C3688 잘못된 리터럴 접두사 'X'입니다. 리터럴 연산자 또는 리터럴 연산자 템플릿 '연산자 ""X'을(를) 찾을 수 없습니다.

비주얼 스튜디오 2008에서 2015로 마이그레이션 중 아래와 같은 에러가 있었습니다. C3688 잘못된 리터럴 접두사 'X'입니다. 리터럴 연산자 또는 리터럴 연산자 템플릿 '연산자 ""X'을(를) 찾을 수 없습니다. 오류(활성) 사용자 정의 리터럴 연산자가 없습니다. C2664 'int sprintf(char *const ,const char *const ,...)': 인수 2을(를) 'std::size_t'에서 'const char *const '(으)로 변환할 수 없습니다. sprintf(sname, "Sheet" X , sheetNo++); 이런 코드에서 발생했는데 X는 아래와 같은 디파인 정의 된 놈이었습니다. #elif _MSC_VER>=1400 // VS 2005 #define X  "%Iu" 아래와 같이 직접 수정 적용해줬습니다. sprintf(sname, "Sheet %Iu ", sheetNo++);

'xxx.exe' 프로그램을 시작할 수 없습니다. 지정된 파일을 찾을 수 없습니다.

이미지
비주얼 스튜디오 2008에서 2015로 마이그레이션 중 아래와 같은 에러가 있었습니다. 'myproject.exe' 프로그램을 시작할 수 없습니다. 지정된 파일을 찾을 수 없습니다. 컴파일, 링크에러를 모두 잡고 프로젝트 실행시 발생한 에러입니다. 디버깅 - 명령에 있는 $(TargetPath)와 링커 - 일반 - 출력 파일에서 설정된 값이 달라서 발생을 했더군요. $(TargetPath) 는 *.exe 였다면 링커쪽에는 $(OutDir)$(ProjectName)_debug.exe 이런식으로 되어 있어서 발생한 에러였습니다. _debug를 지우고 파일명을 같게 해주면 잘 됩니다. 아마 신규로 Visual Studio로 프로젝트 만들어서하면 이런 에러가 없을 것 같은데, 마이그레이션 하면서 자동 수정 업그레이드 된 프로젝트 설정이 문제가 된 것 같네요.

LNK2005 void * __cdecl operator new(unsigned int) 이(가) LIBCMTD.lib(new_scalar.obj)에 이미 정의되어 있습니다.

비주얼 스튜디오 2008에서 2015로 마이그레이션 중 아래와 같은 에러가 있었습니다. LNK2005 "void * __cdecl operator new(unsigned int)" (??2@YAPAXI@Z)이(가) LIBCMTD.lib(new_scalar.obj)에 이미 정의되어 있습니다. LNK2005 "void __cdecl operator delete(void *)" (??3@YAXPAX@Z)이(가) LIBCMTD.lib(delete_scalar.obj)에 이미 정의되어 있습니다. LNK2005 "void * __cdecl operator new[](unsigned int)" (??_U@YAPAXI@Z)이(가) LIBCMTD.lib(new_array.obj)에 이미 정의되어 있습니다. LNK2005 "void __cdecl operator delete[](void *)" (??_V@YAXPAX@Z)이(가) LIBCMTD.lib(delete_array.obj)에 이미 정의되어 있습니다. 프로젝트 속성 - 링커 - 입력 - 추가 종속성에 nafxcwd.lib를 추가해줍니다.

LNK2005 "public: __thiscall CSize::CSize(void)" 이(가) atltypes.obj에 이미 정의되어 있습니다.

비주얼 스튜디오 2008에서 2015로 마이그레이션 중 아래와 같은 에러가 있었습니다. LNK2005 "public: __thiscall CSize::CSize(void)" 이(가) atltypes.obj에 이미 정의되어 있습니다. CSize는 MFC에서 많이 보던 놈인데 왜 win32 프로젝트에서 저런 에러가 날까 싶더군요. 링크에러가 발생하는 atltypes 키워드로 검색을 해보니 아래와 같이 2가지 타입이 나왔습니다. #include "atltypes.h" #include <AtlTypes/atltypes.h> 어떤곳은 atltypes.h로 어떤곳은 AtlTypes/atltypes.h로 사용중인데 atltypes.h은 Visual Studio 설치된 곳에 있는 include 파일입니다. c:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\atlmfc\include\atltypes.h AtlTypes/atltypes.h의 경우는 MS의 atltypes.h를 가져와서 자체적으로 약간 수정해서 만든 파일이더군요. 뭐 아래와 같이 CSize 같은게 또 있더군요. class CSize : public tagSIZE ... 왜 이래놨는지.... 아무튼 자체 h 인 #include <AtlTypes/atltypes.h> 를 사용하게 바꿔주면 링크에러는 사라집니다. 보통은 아래와 같이 inline 문제 이거나 h 파일에 변수를 선언해놓고 중복 으로 include를 해서 사용했을 때 발생하긴 합니다. inline 때문에 생긴 error LNK2005 error LNK2005가 또 날 괴롭히는구나

LNK2026 모듈이 SAFESEH 이미지에 대해 안전하지 않습니다.

이미지
비주얼 스튜디오 2008에서 2015로 마이그레이션 중 아래와 같은 에러가 있었습니다. LNK2026 모듈이 SAFESEH 이미지에 대해 안전하지 않습니다. 프로젝트 속성 - 링커 - 고급 - 이미지에 안전한 예외 처리기 포함을 아니오로 변경하시면 됩니다.

C2678 이항 '!=': 왼쪽 피연산자로 'std::_Binder' 형식을 사용하는 연산자가 없거나 허용되는 변환이 없습니다.

비주얼 스튜디오 2008에서 2015로 마이그레이션 중 아래와 같은 에러가 있었습니다. C2678 이항 '!=': 왼쪽 피연산자로 'std::_Binder<std::_Unforced,SOCKET &,SOCKADDR *,int &>' 형식을 사용하는 연산자가 없거나 허용되는 변환이 없습니다. if(bind(sock,(SOCKADDR*)&adr,iSize) != SOCKET_ERROR) 위와 같이 소켓 바인드를 사용하는 코드였는데 아래와 같이 std::_Binder로 인식이 되고 있더군요. template<class _Fx, class... _Types> inline _Binder<_Unforced, _Fx, _Types...> bind(_Fx&& _Func, _Types&&... _Args) { // bind a callable object with an implicit return type return (_Binder<_Unforced, _Fx, _Types...>( _STD forward<_Fx>(_Func), _STD forward<_Types>(_Args)...)); } 소켓의 bind를 사용하기 위해 범위 확인 연산자 :: 를 지정해주면 됩니다. if( :: bind(sock,(SOCKADDR*)&adr,iSize) != SOCKET_ERROR)

C2678 이항 '==': 왼쪽 피연산자로 'std::ofstream' 형식을 사용하는 연산자가 없거나 허용되는 변환이 없습니다.

비주얼 스튜디오 2008에서 2015로 마이그레이션 중 아래와 같은 에러가 있었습니다. C2678 이항 '==': 왼쪽 피연산자로 'std::ofstream' 형식을 사용하는 연산자가 없거나 허용되는 변환이 없습니다. std::ofstream file( pFilename, ios::out | ios::trunc ); if ( file == NULL ) return; std::ofstream 으로 파일을 처리할 때 발생한 에러입니다. 붉은색 부분을 아래와 같이 바꿔줍니다. if (file.is_open() == false) return;

C2664 'std::pair std::make_pair(_Ty1 &&,_Ty2 &&)': 인수 1을(를) 'DWORD'에서 'DWORD &&'(으)로 변환할 수 없습니다.

비주얼 스튜디오 2008에서 2015로 마이그레이션 중 아래와 같은 에러가 있었습니다. C2664 'std::pair<unsigned long,unsigned long> std::make_pair<DWORD,DWORD>(_Ty1 &&,_Ty2 &&)': 인수 1을(를) 'DWORD'에서 'DWORD &&'(으)로 변환할 수 없습니다. std::multimap<DWORD, DWORD> myMultiMap; myMultiMap.insert(std::make_pair <DWORD, DWORD> (dword1, dword2)); 멀티맵에 insert를 하는데 에러가 발생하네요. 붉은색 부분의 템플릿 타임부분을 삭제해주면 됩니다. myMultiMap.insert(std::make_pair(dword1, dword2));

C2382 'ClassA::~ClassA': 재정의. 예외 사양이 다릅니다.

비주얼 스튜디오 2008에서 2015로 마이그레이션 중 아래와 같은 에러가 있었습니다. C2382 'ClassA::~ClassA': 재정의. 예외 사양이 다릅니다. ~ClassA(); ClassA::~ClassA()     throw ( Error ) {} 선언부분에는 thorw가 없는데 정의한 곳에는 throw를 처리해줘서 발생한 에러입니다. throw(Error)을 제거해줍니다. 기존에  C2694 에러 와 비슷하지만 반대의 에러네요.

C2338 is deprecated and will be REMOVED. Please use . You can define _SILENCE_STDEXT_HASH_DEPRECATION_WARNINGS to acknowledge that you have received this warning.

비주얼 스튜디오 2008에서 2015로 마이그레이션 중 아래와 같은 에러가 있었습니다. C2338 <hash_map> is deprecated and will be REMOVED. Please use <unordered_map>. You can define _SILENCE_STDEXT_HASH_DEPRECATION_WARNINGS to acknowledge that you have received this warning.  #ifndef _SILENCE_STDEXT_HASH_DEPRECATION_WARNINGS static_assert(false, "<hash_map> is deprecated and will be REMOVED. " "Please use <unordered_map>. You can define " "_SILENCE_STDEXT_HASH_DEPRECATION_WARNINGS " "to acknowledge that you have received this warning.");  #endif /* _SILENCE_STDEXT_HASH_DEPRECATION_WARNINGS */ hash_map 파일에 위와 같이 정의 된 부분이 있네요. 프로젝트 속성 - C/C++ - 전처리기 부분에 _SILENCE_STDEXT_HASH_DEPRECATION_WARNINGS 를 추가합니다.

C2694 'Child::~Child(void) throw(Error)': 재정의 가상 함수에 지정된 예외가 기본 클래스 가상 멤버 함수 'Base::~Base(void)'보다 덜 제한적입니다.

비주얼 스튜디오 2008에서 2015로 마이그레이션 중 아래와 같은 에러가 있었습니다. C2694 'Child::~Child(void) throw(Error)': 재정의 가상 함수에 지정된 예외가 기본 클래스 가상 멤버 함수 'Base::~Base(void)'보다 덜 제한적입니다. 관련 에러만 30개 정도 있었는데요, 아래와 같은 구성이었습니다. class Base {       virtual ~Base(); } class Child : public Base {       virtual ~Child() throw(Error); } 자식에는 예외를 지정했는데 부모딴에서 예외 지정이 안 되어 있었습니다. 또는 그 반대 상황이어도 발생할 듯 하네요. 아무튼 아래와 같이 수정해주면 됩니다. class Base {       virtual ~Base() throw(Error) ; } class Child : public Base {       virtual ~Child() throw(Error); } https://msdn.microsoft.com/ko-kr/library/e4x95xf8.aspx

C3861 '_Pow_int': 식별자를 찾을 수 없습니다.

비주얼 스튜디오 2008에서 2015로 마이그레이션 중 아래와 같은 에러가 있었습니다. C3861 '_Pow_int': 식별자를 찾을 수 없습니다. _Pow_int(2, 2); 기존에 사용하던 _Pow_int가 VS2015 오면서 사라진 것인지? pow로 대체해주면 해결됩니다.

비주얼 스튜디오 2015에서 각종(C3861, C2660, C2039, C2065) CRT 컴파일 에러

이미지
비주얼 스튜디오 2008에서 2015로 마이그레이션 중 아래와 같은 에러가 있었습니다. C3861 'GetLogicalDrives': 식별자를 찾을 수 없습니다. C2660 'GetDiskFreeSpace': 함수는 5개의 매개 변수를 사용하지 않습니다. C3861 'CreateFile': 식별자를 찾을 수 없습니다. C2039 'CreateFile': '`global namespace''의 멤버가 아닙니다. C2039 'DeleteFile': '`global namespace''의 멤버가 아닙니다. C2039 'GetFileAttributesEx': '`global namespace''의 멤버가 아닙니다. C2065 'WIN32_FILE_ATTRIBUTE_DATA': 선언되지 않은 식별자입니다. C2065 'fileAttributeData': 선언되지 않은 식별자입니다. C2039 'SetFileAttributes': '`global namespace''의 멤버가 아닙니다. C2039 'FindFirstFile': '`global namespace''의 멤버가 아닙니다. C3861 'FindNextFile': 식별자를 찾을 수 없습니다. C3861 'FindClose': 식별자를 찾을 수 없습니다. C2039 'LocalFileTimeToFileTime': '`global namespace''의 멤버가 아닙니다. C3861 'GetFullPathName': 식별자를 찾을 수 없습니다. C2039 'GetFullPathName': '`global namespace''의 멤버...

C2039 'copy_exception': 'std'의 멤버가 아닙니다.

비주얼 스튜디오 2008에서 2015로 마이그레이션 중 아래와 같은 에러가 있었습니다. C2039 'copy_exception': 'std'의 멤버가 아닙니다. C3861 'copy_exception': 식별자를 찾을 수 없습니다. tbb_exception_ptr ( const captured_exception& src ) : my_ptr(std::copy_exception(src)) {} 해당 에러는 TBB(Threading Building Blocks)  라는 놈에게서 발생했습니다. copy_exception을 make_exception_ptr로 대체해주면 컴파일 에러가 발생하지 않습니다. tbb_exception_ptr ( const captured_exception& src ) : my_ptr(std:: make_exception_ptr (src)) {}

C2039 'list': 'std'의 멤버가 아닙니다.

비주얼 스튜디오 2008에서 2015로 마이그레이션 중 아래와 같은 에러가 있었습니다. C2039 'list': 'std'의 멤버가 아닙니다. C2143 구문 오류: ';'이(가) '<' 앞에 없습니다. C4430 형식 지정자가 없습니다. int로 가정합니다. 참고: C++에서는 기본 int를 지원하지 않습니다. C2238 ';' 앞에 예기치 않은 토큰이 있습니다. std::list<MYLIST> m_list; 단순히 위와같이 사용을 해오던 소스였습니다. list를 인클루르 한 곳이 없는데 여태 잘 작동이 되고 있더군요. 아래와 같이 인클루드를 추가해주면 됩니다. #include <list>