2017의 게시물 표시

[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 foundError 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로 변경 적용합니다.



비주얼 스튜디오 재시작 후 변경 사항이 적용된 것을 확인할 수 있습니다. 다음에 설치할 때 옵션이 있는지 체크해서 아예 영문으로 설치를 해야겠네요.

[Godot Engine] 우분투 유니티 런처에서 앱 아이콘이 보이지 않을 때

이미지
운영체제가 리눅스 기반인 우분투에서는 고도 엔진이 유니티 런처에서 아래와 같이 고도 엔진 자체 앱 아이콘이 보이지 않고 ? 로만 보이는 이슈가 있었습니다. 물론 실행에는 문제가 없었구요. 그래도 뭔가 찝찝한 마음에 해결했던 과정을 정리해봅니다.


먼저 우분투에는 윈도우의 바로가기 단축 아이콘 같은 기능을 하는데 필요한 desktop 라는 파일이 있네요. 이 파일을 만들어서 유니티 런처에서 확인이 되도록 등록을 위해 applications 폴더에 옮겨주어야 합니다.

godot.desktop 파일을 아래와 같은 내용으로 만들어줍니다. 붉은색 Exec와 Icon 부분은 각자 환경에 따라 다를 것 입니다. 고도 엔진 아이콘의 경우 프로젝트를 새로 만들어서 나오는 것을 사용하셔도 되고 고도 엔진 깃헙에 있는 것을 사용하셔도 됩니다.

[Desktop Entry]
Name=Godot Engine
Comment=Free and Open Source 2D and 3D Game Engine
Terminal=false
Type=Application
Categories=Development;IDE;
Keywords=game;engine;ide;
Exec=/home/wwforever/Godot/Godot_v2.1.4-stable_x11.64
Icon=/home/wwforever/Godot/icon.png


그리고 해당 파일을 /usr/share/applications 또는 /usr/local/share/applications에 옮겨줘야 합니다. 로컬쪽에 옮길때는 최초로 작업하는 부분이라면 applications 폴더 자체가 없으므로 /usr/local/share디렉토리에 폴더를 생성해줍니다.

sudo mkdir applications


그리고 만든 파일이 있는 곳에서 applications로 desktop 파일을 복사 해줍니다.

sudo cp godot.desktop /usr/local/share/applications



이제 유니티 런처에서 키워드로 등록했던 godot나 ide를 입력…

Microsoft.Build.Utilities.v12.0 관련 자마린 스튜디오 에러

이미지
비주얼 스튜디오 2015를 지우고 2017을 깔았더니 자마린 스튜디오에서 아래와 같은 에러가 발생했습니다.


Error while trying to load the project 'D:\xxx.csproj': 파일이나 어셈블리 'Microsoft.Build.Utilities.v12.0, Version=12.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' 또는 여기에 종속되어 있는 파일이나 어셈블리 중 하나를 로드할 수 없습니다. 지정된 파일을 찾을 수 없습니다.

위는 기존에 만들어놨던 프로젝트에서 발생한 에러이고 아래는 신규로 GTK# 프로젝트를 만들려고하면 발생하는 에러입니다.


The project could not be created

Could not load file or assembly 'Microsoft.Build.Utilities.v12.0, Version=12.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' or one of its dependencies. 지정된 파일을 찾을 수 없습니다.

아무래도 자마린 스튜디오가 MS Build Tools 2015에 의존성이 있는 것 같습니다. MS 빌드 툴 2015를 설치해주면 잘 됩니다.
Microsoft Build Tools 2015 영문
Microsoft Build Tools 2015 한글

[Godot Engine] 안드로이드 기기 실행 시 스플래쉬 이미지만 깜빡이거나 검은 화면이 나올 때

이미지
고도 엔진을 2.1.2를 사용하다가 2.1.4로 마이그레이션 한 후 안드로이드 실 기기에서 실행시에 아래와 같은 스플래쉬 이미지만 깜빡이거나, 검은 화면이 나오는 이슈가 있었습니다. PC에서 에디터 테스트 환경에서는 이상 없었습니다.



마이그레이션의 경우는 단순히 빌드된 엔진 바이너리 압축본을 풀어서 실행하면 되는 것이기 때문에 딱히 이쪽 문제는 아니었고, 단순히 제가 한가지를 놓친 실수에서 이슈가 발생했네요.


고도의 경우 엔진 바이너리 따로 익스포트(내보내기) 템플릿이 따로 있습니다. 내보내기 템플릿을 설치해줘야 각 플랫폼으로 내보내기를 제대로 할 수 있는데, 2.1.2에서 잘 사용을 하다가 2.1.4에서 아무 생각없이 폰에 넣었더니 이슈가 발생했던거죠.



스샷과 같이 설정 - 내보내기 템플릿 설치에서 다운받은 템플릿, 저의 경우는 Godot_v2.1.4-stable_export_templates.tpz 를 선택해서 설치해주면 됩니다.

소스트리 비교 뷰에서 로그가 짤려 다 나오지 않을 때

이미지
비교적 긴 내용의 수정이 있을때 아래와 같이 diff 뷰에서 로그 확인 중에 ... 으로 나오면서 로그가 다 나오지 않고 짤려 보이는 이슈가 있더군요.



도구 - 옵션 - 비교 탭에서 최대 비교 줄 수가 아마 500이 기본값인데 이 값을 더 크게 설정해주면 됩니다.

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

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

프로젝트를 빌드 중에 아래와 같은 에러가 발생했습니다.

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

비슷한 에러가 비주얼 스튜디오 2003을 윈도우7에서 사용하면서 발생했던 이슈에서도 있었지만, 이번에는 다른 문제가 원인이었습니다. 원인은 바로 출력 디렉토리와 출력 파일이 달라져서 발생했습니다. 기존에는 아래와 같이 되어 있었다면,

출력 디렉토리
../../../../BIN
출력 파일
$(OutDir)/$(SolutionName)$(ConfigurationName).exe


커밋된 내용을 업데이트 받으면서 아래와 같이 임의로 변경이 되면서 기존과 달라져서 pdb 파일을 찾지 못해 에러가 발생했습니다.

출력 디렉토리
D:\myproject\
출력 파일
D:\myproject\myproject_debug.exe

해결은 기존과 같이 내용을 수정해주면 됩니다.

Error CS0400: The type or namespace name 'Mono' could not be found in the global namespace (are you missing an assembly reference?)

이미지
개발 툴을 만들어 보려고 자마린 스튜디오로 GTK# 2.0 프로젝트를 만들어 빌드하니 아래와 같은 에러가 발생했습니다.

TestGTK\gtk-gui\MainWindow.cs(24,24): Error CS0400: The type or namespace name 'Mono' could not be found in the global namespace (are you missing an assembly reference?) (CS0400) (TestGTK)


어떠한 추가 작업을 하지 않은 프로젝트 생성하자마자 빌드 후 에러가 발생한 것이라 당황스럽더군요.

구글링을 해보니 mono.posix를 레퍼런스에 추가해야 한다고하네요. Project - Edit References에서 mono를 검색해봤지만 추가할 수 있는 mono.posix는 검색되지 않았습니다.



혹시나 싶어 Project - Add Nuget Packages 에서 posix를 검색해보니 mono.posix가 나오네요. 2가지 버전이 나오는데 mono.posix 4.5는 다운로드수가 0 이라 안정적인? mono.posix를 설치했습니다.



아래와 같이 프로젝트에 mono.posix가 포함되어집니다.



재 빌드 후 실행하면 아래와 같은 결과를 볼 수 있습니다.


https://forums.xamarin.com/discussion/47461/how-to-even-get-started
https://stackoverflow.com/questions/34006456/the-type-or-namespace-mono-could-not-be-found-in-the-global-namespace

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

이미지
비주얼 스튜디오 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등을 사용해서 처리하도록 하는 방안이었습니다. 그래서 아답터 패턴을 도입하고 아래와 같은 것들을 처리했습니다. 아답터 패턴 처리일반용 Input Adapter - 기존과 같이 Dx Input을 사용해서 처리개발용 Input Adapter - win32 API인 GetAsyncKeyState로 처리KeyDow…

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 에러와 비슷하지만 반대의 에러네요.

[GWork] 컨트롤 Position 적용 안되는 이슈

이미지
Gwork에는 Position을 통해서 쉽게 정렬 처리를 할 수 있습니다. 해당 기능을 사용하다가 제대로 작동하지 않아 분석, 처리한 내용을 정리해봅니다.

enum class Position
{
None        = 0,
Left        = (1<<1),
Right       = (1<<2),
Top         = (1<<3),
Bottom      = (1<<4),
CenterV     = (1<<5),
CenterH     = (1<<6),
Fill        = (1<<7),
Center      = CenterV | CenterH
};

SetPosition시 Position과 패딩값에따라 정렬 처리를 해줍니다.

void Base::SetPosition(Position pos, int xpadding, int ypadding)
{
    const Rect& bounds = GetParent()->GetInnerBounds();
    const Margin& margin = GetMargin();
    int x = X();
    int y = Y();

    if (pos & Position::Left)
        x = bounds.x + xpadding + margin.left;

    if (pos & Position::Right)
        x = bounds.x + (bounds.w - Width() - xpadding - margin.right);

    if (pos & Position::CenterH)
        x = bounds.x + (bounds.w - Width())/2;

    if (pos & Position::Top)
        y = bounds.y + ypadding;

    if (pos & Position::Bottom)
        y = bounds.y + (bou…

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''의 멤버가 아닙니다.
C2065 'OPEN_EXISTIN…

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>

C2668 'abs': 오버로드된 함수에 대한 호출이 모호합니다.

비주얼 스튜디오 2008에서 2015로 마이그레이션 중 아래와 같은 에러가 있었습니다.

오류(활성) 오버로드된 함수 "abs"의 인스턴스 중 두 개 이상이 인수 목록과 일치합니다.
C2668 'abs': 오버로드된 함수에 대한 호출이 모호합니다.

if (abs(tickA - tickB) >= 1000)

이런 호출에서 발생했는데요, abs의 인수가 int, long, long long 총 3개로 오버로드 되어 있더군요. abs의 인수를 강제 형변환 해서 오류를 해결했습니다.

if (abs((long)(tickA - tickB)) >= 1000)

[Compile Error] C2275 'std::string' 와 C2228 '.npos'

비주얼 스튜디오 2008에서 2015로 마이그레이션 중 아래와 같은 에러가 있었습니다.

C2275 'std::string': 이 형식을 식으로 잘못 사용했습니다.
C2228 '.npos' 왼쪽에는 클래스/구조체/공용 구조체가 있어야 합니다.
C2275 'std::string': 이 형식을 식으로 잘못 사용했습니다.
C2228 '.npos' 왼쪽에는 클래스/구조체/공용 구조체가 있어야 합니다.

std::string.npos 로 사용하고 있어서 에러가 발생했습니다. std::string::npos로 바꿔주면 이슈가 발생하지 않습니다.

[GWork] LNK2038 'RuntimeLibrary'에 대해 불일치가 검색되었습니다. 'MDd_DynamicDebug' 값이 'MTd_StaticDebug' 값과 일치하지 않습니다.

이미지
이제 GWork 샘플 빌드를 해봤고 실제로 저희 프로젝트에 연동하기 위해 lib와 h 파일 위치등을 설정해 준 후 빌드를 해보니 아래와 같이 링크에러가 발생했습니다.

LNK2038'RuntimeLibrary'에 대해 불일치가 검색되었습니다. 'MDd_DynamicDebug' 값이 'MTd_StaticDebug'(atltypes.obj에 위치) 값과 일치하지 않습니다.GworkSDL2.lib(SDL2.obj)1

LNK2005"public: __thiscall std::_Lockit::_Lockit(int)" (??0_Lockit@std@@QAE@H@Z)이(가) libcpmtd.lib(xlock.obj)에 이미 정의되어 있습니다.msvcprtd.lib(MSVCP140D.dll)1
LNK2005"public: __thiscall std::_Lockit::~_Lockit(void)" (??1_Lockit@std@@QAE@XZ)이(가) libcpmtd.lib(xlock.obj)에 이미 정의되어 있습니다.msvcprtd.lib(MSVCP140D.dll)1
LNK2005"void __cdecl std::_Debug_message(wchar_t const *,wchar_t const *,unsigned int)" (?_Debug_message@std@@YAXPB_W0I@Z)이(가) libcpmtd.lib(stdthrow.obj)에 이미 정의되어 있습니다.msvcprtd.lib(MSVCP140D.dll)1

LNK2005"void __cdecl std::_Xbad_alloc(void)" (?_Xbad_alloc@std@@YAXXZ)이(가) libcpmtd.lib(xthrow.obj)에 이미 정의되어 있습니다.msvcprtd.lib(MSVCP140D.dll)1
LNK2005"void __cdecl std::_Xlength_error(char const *)…

[GWork,SDL2] 컨트롤이 안보이는 clip 오류 해결하기

이미지
샘플 붉은색으로 렌더링 되던 것을 텍스쳐만 제대로 읽어와서 출력하기만 고친 상태였습니다. 즉, 아래와 같은 상태였는데요


이게 클립핑이 제대로 계산이 안되서 발생하는 이슈였습니다. 실제로 GWork의 SDL2.cpp 소스를 보면

void SDL2::StartClip()
{
    const Gwk::Rect &rect = ClipRegion();

    int w, h;
    SDL_GetRendererOutputSize(SDL_GetRenderer(m_window), &w, &h);

    // Something wrong with clip rectangles in SDL2?
    // https://bugzilla.libsdl.org/show_bug.cgi?id=2700
    // =>   clip.y = screenHieght - clip.y - clip.h;
    const SDL_Rect clip = { rect.x, h - rect.y - rect.h, rect.w, rect.h };

    SDL_RenderSetClipRect(m_renderer, &clip);
}

이렇게 수정의 흔적이 있습니다. 하지만 SDL2도 최신이고 GWork의 소스도 최신인데 수정을 한 부분이 제대로 작동하고 있지 않더군요. 암만봐도 clip 영역 계산이 이상해서 임의로 SDL2::StartClip와 SDL2::EndClip에 return; 처리해서 클립을 처리 안하게 해봤습니다.

void SDL2::StartClip()
{
    return; //not clip
    const Gwk::Rect &rect = ClipRegion();

    int w, h;
    SDL_GetRendererOutputSize(SDL_GetRenderer(m_window), &w, &h);

    // Something wrong with clip rectangles in SDL2?
    // https://bugzi…

[GWork] SDL2 샘플이 붉은색 박스로만 렌더링 되는 이슈

이미지
GWork 폰트 관련 런타임 이슈까지 해결하고 이제 샘플이 뜨나보다 싶었는데 아래와 같이 제대로 뜨지 않고 컨트롤들이 모두 붉은색으로 떴습니다.


GWork 개발자 블로그를 보면 아래와 같이 떠야하는데 말이죠.


같이 뜨는 콘솔창에도 아무런 메시지가 나오지 않았습니다. 그래서 디버깅에 들어갔죠. 일단 텍스쳐 렌더링 하는 곳을 확인해 봤는데 콜스택은 아래와 같습니다.

>GworkSDL2Sample.exe!Gwk::Renderer::SDL2::DrawTexturedRect(Gwk::Texture * texture, Gwk::Rect rect, float u1, float v1, float u2, float v2) 줄 182C++
GworkSDL2Sample.exe!Gwk::Skin::Texturing::Bordered::DrawRect(Gwk::Renderer::Base * render, int i, int x, int y, int w, int h) 줄 169C++
GworkSDL2Sample.exe!Gwk::Skin::Texturing::Bordered::Draw(Gwk::Renderer::Base * render, Gwk::Rect r, const Gwk::Color & col, unsigned int draw) 줄 141C++
GworkSDL2Sample.exe!Gwk::Skin::TexturedBase::DrawTabControl(Gwk::Controls::Base * control) 줄 609C++
GworkSDL2Sample.exe!TabControlInner::Render(Gwk::Skin::Base * skin) 줄 52C++
GworkSDL2Sample.exe!Gwk::Controls::Base::RenderRecursive(Gwk::Skin::Base * skin, const Gwk::Rect & cliprect) 줄 575C++
GworkSDL2Sample.exe!Gwk::Controls::Base::DoRender(Gwk::Skin::B…

[GWork] Font load error : Couldn't open OpenSans.ttf

이미지
GWork가 각종 CMake에러와 dll 에러를 거쳐 이번에는 런타임에 예외가 아래처럼 발생했습니다.

예외 발생(0x71002A85(SDL2_ttf.dll), GworkSDL2Sample.exe): 0xC0000005: 0x00000000 위치를 읽는 동안 액세스 위반이 발생했습니다..


같이 뜨는 콘솔에도 아래와 같이 뜨고 있구요.
Font load error : Couldn't open OpenSans.ttf

이거저거 많이 가져다 사용하다보니 바로 감이 오더군요. 이런건 바로 비주얼 스튜디오의 프로젝트 속성 - 디버깅 - 작업 디렉토리를 확인해봐야합니다. 역시나 작업 디렉토리가 $(ProjectDir)로 설정되어 있습니다. 각자의 환경에 맞게 각종 dll과 폰트 리소스가 들어있는 폴더로 설정 후 다시 디버깅하면 화면이 뜨긴 뜹니다.

[GWork] 프로시저 시작 지점 InterlockedCompareExchange@12을(를) DLL SDL2_ttf.dll에서 찾을 수 없습니다.

이미지
GWork의 CMake관련 에러 4개를 통과한 후 샘플 빌드 후 실행시 아래와 같은 에러가 발생했습니다.

프로시저 시작 지점 InterlockedCompareExchange@12을(를) DLL SDL2_ttf.dll에서 찾을 수 없습니다.

물론 이 에러 이전에도 각종 dll이 없다는 에러가 발생하는데 SDL2.dll, SDL2_image.dll, SDL2_ttf.dll 3개를 작업 디렉토리에 복사해주면 해결됩니다.

아무튼 InterlockedCompareExchange 관련 에러는 SDL2_TTF에 릴리즈용 dll인 libfreetype-6.dll 과 zlib1.dll를 작업 디렉토리에 복사해주면 됩니다. GWork을 쓰기전에는 아직 폰트딴 포팅 시작 안해서 이런 에러가 발생했네요.

[GWork] CMake Error Could NOT find SDL2_image

이미지
이전 Could NOT find SDL2_ttf 에러에 이어 마지막 CMake관련 에러입니다. SDL2로 개발하면 필수 동반 lib인 SDL2_IMAGE 관련 에러입니다.


Project version: 0.2.0 Dev
Including tests
Including sample
<FindSDL2.cmake>
</FindSDL2.cmake>
Found SDL2_ttf: F:/Project/Origin/branch/DarkEdenR/SDL2/SDL2_ttf-2.0.14/lib/x86/SDL2_ttf.lib (found version "..")
CMake Error at C:/Program Files/CMake/share/cmake-3.9/Modules/FindPackageHandleStandardArgs.cmake:137 (message):
  Could NOT find SDL2_image (missing: SDL2_IMAGE_LIBRARIES
  SDL2_IMAGE_INCLUDE_DIRS)
Call Stack (most recent call first):
  C:/Program Files/CMake/share/cmake-3.9/Modules/FindPackageHandleStandardArgs.cmake:377 (_FPHSA_FAILURE_MESSAGE)
  cmake/Modules/FindSDL2_image.cmake:89 (FIND_PACKAGE_HANDLE_STANDARD_ARGS)
  cmake/Config.cmake:123 (find_package)
  CMakeLists.txt:29 (include)

역시나 CMake gui의 Entry를 아래와 같이 설정해줍니다.

SDL2_IMAGE_INCLUDE_DIR : SDL2_IMAGE lib의 include 디렉토리로 설정SDL2_IMAGE_LIBRARY : SDL2_image.lib의 실제 파일로 설정
이제 Configure와 Generate를 눌러보면 이상없이 아래…

[GWork] CMake Error Could NOT find SDL2_ttf

이미지
GWork Could NOT find SDL2 에러에 이어 이번에는 SDL2_TTF lib 관련 에러가 발생했습니다.


Project version: 0.2.0 Dev
Including tests
Including sample
<FindSDL2.cmake>
</FindSDL2.cmake>
Found SDL2: F:/Project/Origin/branch/DarkEdenR/SDL2/SDL2-2.0.5/lib/x86/SDL2main.lib;F:/Project/Origin/branch/DarkEdenR/SDL2/SDL2-2.0.5/lib/x86/SDL2.lib
CMake Error at C:/Program Files/CMake/share/cmake-3.9/Modules/FindPackageHandleStandardArgs.cmake:137 (message):
  Could NOT find SDL2_ttf (missing: SDL2_TTF_LIBRARIES SDL2_TTF_INCLUDE_DIRS)
Call Stack (most recent call first):
  C:/Program Files/CMake/share/cmake-3.9/Modules/FindPackageHandleStandardArgs.cmake:377 (_FPHSA_FAILURE_MESSAGE)
  cmake/Modules/FindSDL2_ttf.cmake:89 (FIND_PACKAGE_HANDLE_STANDARD_ARGS)
  cmake/Config.cmake:122 (find_package)
  CMakeLists.txt:29 (include)


아래와 같이 설정해주면 됩니다.

SDL2_TTF_INCLUDE_DIR : SDL2_TTF가 설치 된 곳의 include 디렉토리 설정SDL2_TTF_LIBRARY : SDL2_ttf.lib 가 있는 경로 및 실제 파일을 설정
여기서 끝이 아닙니다. 마지막 CMake 관련 에러가 남아 있으니..

[GWork] CMake Error Could NOT find SDL2 (missing: SDL2_LIBRARY SDL2_INCLUDE_DIR)

이미지
GWork CMake 관련 No renderer was specified. See RENDER_ options에러를 통과하면 아래와 같은 에러를 볼 수 있습니다.

Project version: 0.2.0 Dev
Including tests
Including sample
<FindSDL2.cmake>
Looking for pthread.h
Looking for pthread.h - not found
Found Threads: TRUE
</FindSDL2.cmake>
CMake Error at C:/Program Files/CMake/share/cmake-3.9/Modules/FindPackageHandleStandardArgs.cmake:137 (message):
  Could NOT find SDL2 (missing: SDL2_LIBRARY SDL2_INCLUDE_DIR)
Call Stack (most recent call first):
  C:/Program Files/CMake/share/cmake-3.9/Modules/FindPackageHandleStandardArgs.cmake:377 (_FPHSA_FAILURE_MESSAGE)
  cmake/Modules/FindSDL2.cmake:169 (FIND_PACKAGE_HANDLE_STANDARD_ARGS)
  cmake/Config.cmake:121 (find_package)
  CMakeLists.txt:29 (include)

SDL2를 렌더러로 선택했으니 이제 SDL2를 찾으려고 하다가 발생한 에러입니다. CMake GUI 툴에서 보이는 각 Entry를 아래와 같이 설정합니다.
SDL2MAIN_LIBRARY : SDL2main.lib 이 있는 경로와 실제 파일을 지정SDL2_LIBRARY_TEMP : SDL2.lib 이 있는 경로와 실제 파일을 지정SDL2_INCLUDE_DIR : SDL2가 설치된 폴더의 include 디렉토리로 설정 CEGUI랑은 Entry의 방식이 약간 다…

[GWork] CMake Error No renderer was specified. See RENDER_ options

이미지
GWork라는 GUI lib를 CMake 빌드 중 아래와 같이 에러가 발생했습니다.


Project version: 0.2.0 Dev
Including tests
Including sample
CMake Error at cmake/Config.cmake:148 (message):
  No renderer was specified.  See RENDER_<name> options.
Call Stack (most recent call first):
  CMakeLists.txt:29 (include)

단순히 CMake GUI 버전에서 Where is the source code와 Where to build the binaries를 설정하고 Configure를 눌렀을 뿐인데 에러가 발생하네요. cegui나 mygui는 안 그랬던거 같은데요.

Config.cmake 파일을 보면 아래와 같이 GWK_RENDER_NAME이 NOT 일 때 에러를 발생해주네요.

if(NOT GWK_RENDER_NAME)
    message(FATAL_ERROR "No renderer was specified. See RENDER_<name> options.")
endif(NOT GWK_RENDER_NAME)


그 위로 올라가보면 각종 렌더러 설정을 해주는게 있는데요 전부 if로 되어있고 아마 기본 설정이 아무것도 안되어 있어서 에러가 발생한 듯 합니다.
...
if(RENDER_SDL2)
    find_package(SDL2 REQUIRED)
    find_package(SDL2_ttf REQUIRED)
    find_package(SDL2_image REQUIRED)
    set(GWK_RENDER_NAME "SDL2")
    set(GWK_RENDER_INCLUDES ${SDL2_INCLUDE_DIR} ${SDL2_IMAGE_INCLUDE_DIR} ${SDL2_TTF_INCLUDE_DIR})
    set(GWK_REND…

[Lua,GUITool] 루아로 게임 GUI와 툴 개발하기 위한 리서치

사내 프로젝트의 GUI는 정말 유지보수 하기 힘든 상태입니다. 하드코딩에 복잡하고 지저분하고 등등등 이루 말할 수 없죠. 그 와중에 잠깐 자체 스크립트(txt)로 구현된 신규 UI에 대한 분석 업무가 주어졌었고 분석 중에 이건 아니다 싶어서 기존 UI를 루아(Lua)로 바인드 시켜 개발을 하는 방향으로 가야겠다 생각했었습니다.

그때 당시 최종 결정난 것은 그냥 기존 UI 시스템 그대로 가자였고 지금은 엔진을 SDL2로 포팅중이기 때문에 지난 GUI 모듈 리서치 포스팅에 있던 것 중 GWork를 사용할 예정입니다. 루아를 사용하지는 않겠지만, 일단 리서치 했던 내용이 좀 아까워서 리서치 한지 1년이 다 되가는 내용 정리를 시작해봅니다.

일단 루아를 선택하게된 계기로 돌아가면, 신규 자체 UI 스크립트 시스템이라고 있었지만 스크립트라는 것 하나의 장점만 있었지 그 외에는 단점이 더 많았습니다. 단점 목록은 아래와 같은데요,

txt 자체 스크립트의 활용스크립트 자체 가독성과 파싱 처리가 별로UI 컨트롤의 부족기존 ui와 비슷한 단 2개의 컨트롤만 만들어진 상태기존 ui와 호환성 없음. 다 다시 만들어야 함 안되겠다 싶어서 해당 안건에 대한 분석은 종료했었습니다. UI 작업은 저희처럼 툴도 없는 상황이고 시스템도 확장성이 고려된 상황이 아니면 노가다성이 심하죠. 그렇다고 현재 UI 시스템을 갈아엎고 다시 만드는건 너무 비용이 큰 것 같았습니다.
그래서 루아로 방향을 선회했던거죠. 차라리 현 GUI 구조도 별로지만 1차적으로 UI 생성과 관련된 컨트롤들을 루아로 바인딩 시켜 하드코딩이라도 좀 줄이고, 2차적으로 UI의 함수들의 기능까지 빼서 더 개선할 생각으로 말이죠.


루아는 현 모바일 게임 시대 이전 MMORPG 게임 분야에서 인기짱? 스크립트 언어였죠. 와우 덕분으로 알고 있는데, 사실 모바일에서도 Cocos2d-x나 다른 몇 엔진에서도 사용되고 있기는 합니다. 제가 생각하는 루아로 GUI 처리를 했을때의 장, 단점은 아래와 같습니다.
장점프로그래머 친화적 스크립트(…

[NSIS] Internal compiler error #12345: error mmapping datablock to

이미지
NSIS(nullsoft scriptable install system) 최신 버전인 3.01을 사용중에 아래와 같이 에러가 발생했습니다.

Internal compiler error #12345: error mmapping datablock to 163167.
Note: you may have one or two (large) stale temporary file(s) left in your temporary directory (Generally this only happens on Windows 9x).

공식적으로 NSIS는 2기가 이상 풀 패키징하는 것을 지원하지 않는다고 합니다. 해결책은 CAB 또는 7z 방식을 이용하는 것도 있지만 간편하게 소스포지에 nsisbi라고 2기가 제한을 해제한 NSIS 바이너리가 올라온 것을 사용하면 된다.


http://netopensource.com/projects/nsisbi/