9월, 2017의 게시물 표시

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)