8월, 2017의 게시물 표시

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…