vcproj/sln version convertor

Posted at 2010/03/10 17:00// Posted in msvc
무려 12년 전 -_-
...
철 없던 시절부터 만들었던 게임이
아직도 서비스 되는 행운(-_-) 으로 인해

요즘 만져야 하는 컴파일러가 vc6 부터 vc9 까지...

다양하다보니 프로젝트 파일 관리만으로도 정신이 없는 상황입니다.

평소 세심한 성격이 아니고
매의 눈을 가진 것도 아닌지라
프로젝트 포팅에 어려움을 겪고 있었는데

동호님께서 아래와 같은 멋진 툴을 알려 주시는군요! >ㅁ<)b

http://sourceforge.net/projects/vspc/

비주얼 스튜디오 프로젝트 버전 별로 변환시켜주는 프로그램입니다.

정말 좋습니다 T _T)/

이올린에 북마크하기(0) 이올린에 추천하기(0)
2010/03/10 17:00 2010/03/10 17:00
vc2005 프로젝트를 vc2008 프로젝트로 변환시 발생하는 것으로 보인다.

컴파일러 경고(수준 3) C4748

오류 메시지

함수에서 최적화를 사용하지 않으므로 /GS를 지정해도 로컬 버퍼 오버런에서 매개 변수 및 지역 변수를 보호할 수 없습니다.
/GS can not protect parameters and local variables from local buffer overrun because optimizations are disabled in function

기본적으로 활성화되어 있는 /GS(버 퍼 보안 검사)는 함수의 최적화 기능을 사용하지 않는 한 함수의 매개 변수와 지역 변수에서 로컬 버퍼 오버런이 발생하지 않도록 보호할 수 없습니다.

함수에 jmp 또는 jcc와 같은 흐름 제어 문이 포함된 인라인 어셈블리 코드가 있는 경우 컴파일러는 최적화를 비활성화합니다.

이 경고를 해결하고 /GS를 사용하여 로컬 버퍼 오버런에서 매개 변수와 지역 변수를 보호하려면 최적화를 활성화해야 합니다.

http://msdn.microsoft.com/ko-kr/library/ms235398%28VS.80%29.aspx

MSDN 도움말을 찾아보니...

아아-_- ... 뭘 어떻게 하라는건지...;; orz;;


대부분의 구글 검색 결과도 MSDN 도움말의 답습일뿐
뽀족한 해결책은 제시하지 못하고 있는 상황에서 방황하던 중...

ogre 포럼에서 아래와 같은 주옥같은 답변을 찾아내게되었다 -_-)/

I've found the error: -
저는 에러를 찾았어요 >ㅁ<)/

Visual Studio 2008 SP1 turns off /O2 optimization when upgrading from VS 2005. Even if it *Looks* like its on, it may not be. Check that its actually in the command line (also - it is Bold in the IDE if its enabled).
비주얼 스튜디오 2008 SP1 은 O2 최적화를 꺼버립니다. VC2005 에서 업그레이드할때 말예요! 켜진 것처럼 보이지만, 그렇치 않습니다. 실제로 적용도는지 확인할 필요가 있어요. 커맨드라인에서 말이죠. ( IDE상에서는 굵고 진하게 볼드체로 되어있어야 합니다. )

I hope this helps someone googling :)
구글링을 통해 다른 분들에게 도움이 되었으면 좋겠내요 ^_^

http://www.ogre3d.org/forums/viewtopic.php?f=10&t=49787

와 >ㅁ<)/ 천사님!!


실제 Configuration Properties 의
C/C++/Optimization/Optmization 속성을 보면 볼드체가 아닌걸 확인할 수 있었다.

직접 항목을 다시 선택해주면 볼드체로 바뀌며 다시 링크를 해보면 C4748 경고는 사라지게 된다. ~(-_-)~








이올린에 북마크하기(0) 이올린에 추천하기(0)
2010/02/11 22:39 2010/02/11 22:39

msvc 외부 솔류션 관리 정책에 대해서

Posted at 2010/02/02 13:10// Posted in msvc
http://www.freebsd.org/ports/

FreeBSD 의 솔류션 포팅 검색 페이지입니다.
만약 devil 이 사용하고 싶다면 검색 상자에 devil 라고 입력하면 됩니다.
그럼 어느 위치에 devil 포트가 존재하는지 나옵니다.

그럼 사용자는 cd /usr/ports/graphics/devil 에 들어가서
make install 만 입력하면 알아서 소스를 받아서 설치하게 됩니다.

...; 사실 이런 수준까지 개인 혹은 작은 회사 수준에서 구축하는건 힘들다고 봅니다.

여기에서 중요하게 체크할만한 부분은 버전 관리입니다.

devil-1.7.8

프로젝트명-버전

살아있는 프로젝트는 새로운 기능에 대한 요구와 버그에 대한 수정으로 인해 계속 버전이 올라가게 됩니다.
문제는 버전업으로 인해 기존 프로젝트가 컴파일이 안되거나 오작동을 할 수 있다는 사실입니다.
즉, 외부 솔류션을 사용한다면 사용하는 다양한 솔류션에 대한 버전을 관리해야 한다는 것이죠.

예를 들어 python 은 python-2.4, python-2.5, python-2.6 은 거쳐오면서 새로운 기능 추가와 버그 수정이
이루어졌지만 큰 틀은 변화가 없기 때문에 대개 큰 문제없이 빌드가 됩니다. 설령 문제가 되더라도 변경된점을
잠깐만 봐도 수정이 가능합니다.

하지만 python-3.0 은 베이스 부분에 매우 큰 변화가 있기 때문에, 적용하기 위해서는 꽤 많은 노력이 필요합니다.
덕분에 아직까지도 python-3.0 프로젝트는 별로 없는 상황이죠.


어쨌든 외부 솔류션을 사용하는 입장에서 해당 프로젝트가 어떻게 진행될지는 모릅니다.
그냥 현재 버전을 알아서 고쳐서 쓸 수도 있겠지만, 언젠가는 새로운 버전의 솔류션을 써야할 때가 다가오게 됩니다.
python-2.6 을 쓰면서 마이너 업그레이드 버전인 python-2.7 과 메이저 업그레이드 버전인 python-3.0 이 동시에
설치 되어 있어야 합니다.

external/python-2.6/bin
external/python-2.6/include
external/python-2.6/libs

external/python-2.7b/bin
external/python-2.7b/include
external/python-2.7b/libs

external/python-3.1/bin
external/python-3.1/include
external/python-3.1/libs

이제 남은 문제는 어떻게 내가 원하는 버전을 사용하느냐 입니다.

솔류션 별로 사용해야 헤더는 python.h 로 동일합니다.


#include <python.h>


쉽게 생각해낼 수 있는 방법은 프로젝트에 추가 INCLUDE 와 LIB 디렉토리를 연결해주는 것입니다.

-I../../../../external/python-2.6/include
-L../../../../external/python-2.6/libs

난감한 점은 몇개가 될지 모르는 상대 경로와 디렉토리의 개수입니다.

사실 솔류션별 디렉토리 개수는 감내할만 한데,
상대 경로가 제일 걸림돌입니다. msvc 에서 단축 상대 경로만 지원해주면 좋을텐데 방버을 잘 모르겠습니다.

$(EXTERN)/python-2.6/include
$(EXTERN)/python-2.6/lib

만약 이런 정도만 지원되면 꽤 쓸만한 솔류션이 될 것으로 보입니다.
단점은 새로운 프로젝트를 만들때마다 조금 손이 많이 가서 귀찮아진다는 것입니다.
아무래도 자동화된 설정 유틸리티를 필요로 하죠~


또 다른 방법은 아예 솔루션 폴더명을 포함시키는 방법입니다.


#include <python-2.6/python.h>

#pragma comment(lib, "python-2.6-x86-vc80-MT.lib")


위의 방법의 장점은
외부 솔류션을 사용하는 입장에서 매우 편하다는 것입니다.
#ifdef - #endif 를 사용해서 다음 버전을 사용해보는 것도 간단합니다.

단점은 외부 솔류션을 일일이 손봐줘야 될 필요가 있다는 것입니다.
사용하는 외부 솔류션이 규모가 조금 클 경우 헤더 교체 작업이 꽤 귀찮아질 수 있습니다.
라이브러리명도 손봐줘야 하죠.

별도 외부 솔류션 관리 인력이 존재한다면 추천할만한 방법입니다.
이올린에 북마크하기(0) 이올린에 추천하기(0)
2010/02/02 13:10 2010/02/02 13:10

msvc 외부 솔루션 관리 필요성에 대해서

Posted at 2010/02/02 12:41// Posted in msvc
요즘 프로젝트를 진행할 때는 외부 솔류션을 사용하는 것이 매우 흔한일입니다.

zlib, tinyxml, devil, boost, expat, freetype, wx 같은 오픈 소스 솔류션 부터
directx, nvidia-texture-tools, fbx 무료 바이너리 솔류션이나
pathengine, speedtree, granny, ipp, mss 같은 유료 바이너리 솔류션까지
하나의 프로젝트에 수십 종류의 크고 작은 외부 솔류션이 포함되게 됩니다.

각 솔류션들을 솔류션 버전, 컴파일러 버전, 쓰레드 모델, CPU 모델 등에 따라 잘 분류해 놓지 않으면
새로운 버전의 솔류션이 나와도 적용하지 못한다던지, 서로 다른 쓰레드 모델(MD, MDd, MT, MTd)간의
충돌로 인한 링크 에러나 런타임 에러가 발생하게 됩니다.

freebsd 나 linux 등에서는 운영체제 레벨에서
다양한 솔류션들을 일관성있게 사용할 수 있도록 지원을 해주는데,
윈도우의 경우는 통합적인 지원이 없는 관계로 각 솔류션들의 배포본 설치에 의존하는 경우가 많아
혼란스러운 경우가 많습니다.

상용 프로젝트의 경우는 미리 빌드된 바이너리를 배포하기 때문에 어느정도 정리가 된 경우가 많지만,
대부분의 오픈소스 프로젝트는 당시 가장 많이 사용되는 visual studio 만 지원하는 경우가 많습니다.
미리 빌드된 바이너리도 MD, MDd 인 경우가 많죠.

boost 정도가  bjam 을 사용해서 다양한 컴파일러/CPU/쓰레드 모델을 지원해주고 있습니다.


요즘 앱스토어가 등장하는 트렌드로 보아
조만간 윈도우에서도 자동화된 솔류션 관리 시스템이 채용되지 않을까 기대하고 있습니다만...
그전까지는 직접 windows ports 시스템을 구축해야 할 필요가 있습니다.







이올린에 북마크하기(0) 이올린에 추천하기(0)
2010/02/02 12:41 2010/02/02 12:41

DevIL 윈도우에서 빌드하기

Posted at 2009/05/18 11:27// Posted in msvc
게임에서 잡다구리 이미지 포멧을 읽을때 DevIL 을 사용하고 있습니다.
몇년간 대규모 업데이트가 없어서 잊고 살다가...
쓰레드 모델 문제 때문에 소스를 다시 받아보려고 찾아가보니~
http://openil.sourceforge.net/

엄청 활발하게 활동하고 있는 것 같내요 -ㅁ-)/
윈도우 사용자를 위한 LibCompiled.zip 도 다시 지원하고 말이죠 햐햐 -ㅂ-

하지만 다운로드 소스는 윈도우 프로젝트 파일이 빠져있더군요 -_-;
요즘은 다들 SVN 저장소로 직접 다운로드 받기 때문인지 잘 관리가 안되는걸까요..

그래서 저도 SVN 저장소로 다운 받았습니다.
https://openil.svn.sourceforge.net/svnroot/openil/trunk/DevIL

윈도우는 의존성을 알아서 찾아야 하는데-_-;
매우 귀찮은 작업이므로 그냥 컴파일된 것도 받아서
http://downloads.sourceforge.net/openil/LibCompiled-vc8.zip

압축을 푼다음 src-IL/include 와 src-IL/lib 폴더에 복사해둡니다.

vc2005 솔류션은 projects/msvc8/ImageLib.sln 입니다.
src-IL 프로젝트 라이브러리 설정에 src-IL/lib 연결이 없으므로 연결해주시고요~

컴파일전에 include/config.h.win 을 include/config.h 로 이름을 변경하고 설정작업을
해줘야 합니다. 그냥 빌드하면 각종 라이브러리가 없다고 에러를 냅니다-_-


#define IL_NO_BLP
// #define IL_NO_BMP
#define IL_NO_CUT
#define IL_NO_CHEAD
#define IL_NO_DCX
// #define IL_NO_DDS
#define IL_NO_DICOM
#define IL_NO_DOOM
#define IL_NO_EXR
#define IL_NO_FITS
#define IL_NO_FTX
// #define IL_NO_GIF
// #define IL_NO_HDR
// #define IL_NO_ICO
#define IL_NO_ICNS
#define IL_NO_IWI
#define IL_NO_JP2
// #define IL_NO_JPG
#define IL_NO_LCMS
#define IL_NO_LIF
#define IL_NO_MDL
#define IL_NO_MNG
#define IL_NO_PCD
// #define IL_NO_PCX
#define IL_NO_PIC
#define IL_NO_PIX
// #define IL_NO_PNG
#define IL_NO_PNM
// #define IL_NO_PSD
// #define IL_NO_PSP
#define IL_NO_PXR
// #define IL_NO_RAW
#define IL_NO_ROT
#define IL_NO_SGI
#define IL_NO_SUN
// #define IL_NO_TGA
// #define IL_NO_TIF
#define IL_NO_TPL
#define IL_NO_WAL
#define IL_NO_WDP
#define IL_NO_XPM

// 중간 생략

//#undef ILUT_USE_DIRECTX8
#define ILUT_USE_DIRECTX9
//#define ILUT_USE_DIRECTX10
#define ILUT_USE_OPENGL
//#define ILUT_USE_SDL
#define ILUT_USE_WIN32


그냥 유명한 확장자 빼고는 전부 IL_NO_* 주석을 풀어주세요~
ILUT 플랫폼도 사용하고자하는 플랫폼만 남기고 주석처리합니다

컴파일하다보면 ilu_error.c 에서 다국어 에러 메시지 처리 때문에 에러를 내는데

#include "ilu_internal.h"
+#include "ilu_error/ilu_err-english.h"
+/*
#include "ilu_error/ilu_err-arabic.h"
#include "ilu_error/ilu_err-dutch.h"
-#include "ilu_error/ilu_err-english.h"
#include "ilu_error/ilu_err-french.h"
#include "ilu_error/ilu_err-german.h"
#include "ilu_error/ilu_err-italian.h"
#include "ilu_error/ilu_err-japanese.h"
#include "ilu_error/ilu_err-spanish.h"
+*/

-
ILconst_string *iluErrors;
ILconst_string *iluLibErrors;
ILconst_string *iluMiscErrors;
-#define ILU_NUM_LANGUAGES 8
+#define ILU_NUM_LANGUAGES 1

ILconst_string *iluErrorStrings[ILU_NUM_LANGUAGES] = {
iluErrorStringsEnglish,
+ /*
iluErrorStringsArabic,
iluErrorStringsDutch,
iluErrorStringsFrench,
@@ -36,10 +38,12 @@
iluErrorStringsSpanish,
iluErrorStringsGerman,
iluErrorStringsItalian
+ */
};

ILconst_string *iluLibErrorStrings[ILU_NUM_LANGUAGES] = {
iluLibErrorStringsEnglish,
+ /*
iluLibErrorStringsArabic,
iluLibErrorStringsDutch,
iluLibErrorStringsFrench,
@@ -47,10 +51,12 @@
iluLibErrorStringsSpanish,
iluLibErrorStringsGerman,
iluLibErrorStringsItalian
+ */
};

ILconst_string *iluMiscErrorStrings[ILU_NUM_LANGUAGES] = {
iluMiscErrorStringsEnglish,
+ /*
iluMiscErrorStringsArabic,
iluMiscErrorStringsDutch,
iluMiscErrorStringsFrench,
@@ -58,6 +64,7 @@
iluMiscErrorStringsSpanish,
iluMiscErrorStringsGerman,
iluMiscErrorStringsItalian
+ */

한글도 없고 귀찮으니 영어만 남기고 제거합니다.

~(-_-)~ 이제 사용하기만 하면 됩니다~ 짜잔~
이올린에 북마크하기(0) 이올린에 추천하기(0)
2009/05/18 11:27 2009/05/18 11:27