728x90

Visual Studio 2013 이전 컴파일러에서 작성된 멀티바이트 문자 집합 스타일의 프로젝트를 Visual Studio 2013에서 불러와 변환 후 컴파일을 하면 다음과 같은 에러 메세지가 발생하게 된다.



error MSB8031: Building an MFC project for a non-Unicode character set is deprecated. You must change the project property to Unicode or download an additional library. See http://go.microsoft.com/fwlink/p/?LinkId=286820 for more information.    C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V120\Microsoft.CppBuild.targets





VS 2013부터 멀티바이트문자집합용 MFC 라이브러리가 포함되지 않은 채 나오기 때문에 위와 같은 에러가 발생하는 것이다. 


쉽게 말하면, 유니코드를 사용하여 개발하라는 것이다.





하지만, MS에서 제공하는 "Visual Studio 2013용 멀티바이트 MFC 라이브러리" 를 설치하면 이 문제가 해결된다.


이것은 임시 방편이라고 생각하자.



다운로드 링크 : https://www.microsoft.com/ko-kr/download/confirmation.aspx?id=40770

728x90
728x90

이번 프로젝트 중에 LOGFONT를 쓸 일이 있어서 LOGFONTA로 작업을 했다가 LOGFONTW로 변경해야 하는 시점이 왔다.


그래서 SetTitle(, , , , LOGFONTA) -> SetTitle(, , , , LOGFONTW) 로 변경하는 작업을 진행하는 도중 이상한 현상을 발견하였다.



int main()

{

LOGFONTW lf; <- 정상적인 값 세팅.


SetTitle(, , , , lf );

}


void SetTitle(, , , , LOGFONTW in_lf)

{

in_lf; <- 이 시점에서 봤을 때 값은 쓰레기 값이었다.

}



그래서 Packing 크기와 구조체의 크기 등등을 비교해도 다 같은데 왜 값이 서로 다른지에 대해 찾아보던 중


메모리 값을 비교해보니 lf의 주소값이 in_lf의 첫번째 멤버변수에 들어가 있는 것을 확인했다.


그래서 이런저런 테스트를 더 해보려고했지만, 개발 일정이 늦은 상태이기 때문에 다음에 더 테스트를 더 해봐야 할듯하다. ㅎㅎ



결론은


void SetTitle(, , , , LOGFONTW in_lf) -> void SetTitle(, , , , const LOGFONTW& in_lf) 로 바꾸면 정상적인 값으로 들어간다.

728x90
728x90



이 메세지의 경우 개발하면서 되게 자주보게 된다.... (코딩을 못해서 그런가...)


DirectX11로 개발하면서 특정 하드웨어 스펙에서만 이 에러가 발생해서 인터넷을 찾아봤더니,


MS에서 좋은 자료를 찾았다.


https://support.microsoft.com/en-us/kb/2628738


https://msdn.microsoft.com/en-us/library/windows/hardware/ff569918(v=vs.85).aspx



쉽게 말해서, 레지스트리를 수정하여 디스플레이의 작업 시간이 2초가 넘어가도, 디스플레이의 재시작을 하지 않는 방법이다. (8초로 수정)



cmd -> regedit -> HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\GraphicsDrivers -> TdrDelay(8)

-

728x90
728x90

컴퓨터를 바꾸게 되어 코드를 옮기고 


빌드를 하려고 하는데 갑자기 


FXC : error X3501: 'main': entrypoint not found


라는 에러 메시지가 출력되었다.

이것은 HLSL 컴파일러의 형식, 타입이 잘못 설정되어 있어서 생기는 문제였다.

다음과 같이 속성을 변경해 주면 된다. (셰이더 모델과 타입은 현재 작성한 HLSL에 맞추어서 변경하면 된다.)


728x90
728x90

업무용 컴퓨터에 얼마 전부터 (글 작성시점은 2016년 3월) 


"컴퓨터에 api-ms-win-crt-runtime-l1-1-0.dll이(가) 없어 프로그램을 시작할 수 없습니다. 프로그램을 다시 설치하여 이 문제를 해결하십시오."


api-ms-win-crt-runtime-l1-1-0.dll is missing <-- 구글링한 문장은 이것.


란 메시지 박스가, 일부 프로그램을 실행할 때마다 떴다. 메시지 박스의 "확인"버튼만 눌러주면 프로그램은 정상적으로 실행되는 것 같았지만, 꺼림직하여 구글링으로 문제의 해결방법을 찾았다.


문제는 visual studio 2015용 visual c++ 재배포 패키지를 마이크로소프트에서 다운받아 설치하여 해결됐다. 32비트 재배포 패키지와 64비트 재배포 패키지를 받을 수 있는데, 나의 경우는 64비트 재배포 패키지만 받아서 깔아 해결됐다.


문제가 발생한 환경은 한국어 윈도우7 64비트.


출처 : http://daewonyoon.tistory.com/179



728x90
728x90

Visual Studio를 사용하다 보면 가끔 "디버깅 정보를 찾을 수 없거나 정보가 일치하지 않습니다." 라는 메세지를 띄우며 디버깅이 안될 때가 있다. 


이럴 때에는 아래와 같이 프로젝트 위에서 오른쪽 클릭으로 '속성'에 들어가서 세가지를 변경하면 된다.


  • 프로젝트 속성 - C/C++ - 일반 - 디버깅 정보 형식 - 편집하며 계속하기를 위한 프로그램 데이터베이스(/ZI)

  • 프로젝트 속성  - C/C++ - 최적화 - 최적화 : 사용 안 함(/Od)

  • 프로젝트 속성 - 링커 - 디버깅 - 디버그 정보 생성 : 예(/DEBUG)


ps. Release에서 변경하면 배포시에 속도가 느려질 수 있으니 Debug에서만 하도록 하자....



728x90
728x90

Visual Studio 2010으로 작업하는 도중에 아래 그림과 같이 Stack Overflow가 발생했었다.



그림 - 0xC00000FD: Stack oveflow


이것은 기본 배열이 0x7fffffff 크기를 초과해서 이다.

이 문제를 해결하기 위해서는 배열 대신 동적 할당을 이용해서 Heap에 저장하는 방법이 있다. (나는 이렇게 고쳤다...)


도저히 코드 수정이 불가능한 상태라면 프로젝트의 옵션을 수정하는 방법이 있다.

그것은 원래 default로 제공되는 stack의 공간을 수정하는 방법인데 원래 값은 1MB로 되어 있다. 이것을 임의의 값으로 강제로 늘려버리면 된다.


그림 - 프로젝트 설정 값 변경


링커 -> 시스템 -> 스택 예약 크기에서 0으로 되어 있는 설정 값을 1024 * 1024 * 1 = 1MB이므로 1024 * 1024 * 10 = 10485760(10MB)로 입력한다.


이렇게 코드를 변경하지 않고 수정하는 방법도 있다. 하지만, 프로젝트 옵션을 수정하는 것은 최후의 최후의 방법으로 쓰도록 하자...


* Visaul Studio 2013을 사용하기 시작했는데, 2013은 처음부터 배열의 크기가 넘어가면 빌드 에러를 띄워준다. (고맙...)


참고 : http://ocllos.tistory.com/39

728x90

+ Recent posts