Notice»

Recent Post»

Recent Comment»

Recent Trackback»

Archive»

« 2024/4 »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30

 
 

boost

프로그래밍/C, C++ | 2009. 9. 25. 11:26 | Posted by 99%

http://www.boost.org
http://www.boost.org/users/news/



설치

다운로드
http://sourceforge.net/projects/boost/files/

boost는 date_time의 IO기능과 regex, thread, python, signals, test, filesystem등의 빌드가 필요한 라이브러리를 사용하지 않는다면 헤더파일을 include하는 것만으로 사용 가능하다. 환경설정에서 c:\boost_1_34_1와 같이 boost 상위 디렉토리를 등록해준다.
그외에 빌드를 해야하는 라이브러리 사용시는 아래를 참고하자.

1. boostpro

Visual Studio.Net(VC 7.1이상) 사용자는 boostpro라는 자동설치프로그램을 이용해서 boost를 자동설치 할수 있다.
http://www.boostpro.com/download

테스트시 9.0라이브러리 전체 선택하고 30분 정도 걸림

참고
http://neodreamer.tistory.com/158

2. Visual C++ 6(VC6)

vc6에서 빌드해서 사용하기 위해선 1_34_1버젼을 사용하기 바란다. 상위버젼은 vc를 설치하고 Platform SDK만 설치했는데도 제대로 빌드가 안된다.또한 VC6과 상위버젼을 같이 사용시 빌드 옵션을 -sTOOLS=msvc로 설정해도 상위버젼의 컴파일러로 빌드가 된다.(필자는 vc6과 2008을 같이 사용중인데 계속 vc9(2008)로만 컴파일이 된다.) 이렇게 두개의 vc버젼을 같이 사용할때는 vc6를 먼저 설치하고 빌드한후 다른 vc버젼을 설치해서 사용하는게 편하다.

참고로 1_34_1에는 circular_buffer가 없다. 또한 1_34_1버젼까지는 boostpro도 vc7.1까지만 지원한다.
boost사이트의 다운로드에 boost-binaries라고 컴파일된 결과물이 올라와 있지만 vc6용은 없다.
공식적인 문서는 확인 못했지만 vc6지원을 버린듯 하다;(STLPort를 설치하면 1_34_1 상위버젼도 빌드가 될지도 모르겠다.)

3. 빌드옵션

컴파일러
-sTOOLS=msvc
6.0: msvc
7.0: vc7
7.1(2003): vc-7_1
8.0(2005): vc-8_0
9.0(2008): vc-9_0


STLPort
1) -sTOOLS 옵션에 -stlport추가
ex) -sTOOLS=msvc-stlport

2)
stlport-iostream 사용시 -sBUILD에 on 추가
-sBUILD=on

3) -sSTLPORT_PATH="D:"

4) -sSTLPORT_VERSION=5.0.1

5) <stlport-cstd-namespace>global 는 컴파일하면서 vsprintf가 global namespace에 없다고에러가 발생해서 적어주었습니다.


-sBUILD
debug release
<runtime-link>static/dynamic
<threading>single/multi


install
기본 디렉토리 "c:\boost"
"--prefix=C:\Program Files\Microsoft Visual Studio\VC98"


참고
STLPort4.6.2, STLport 5.0.1, boost 1.33.1 (spirit설치)
STLport 4.6.2 설치하기 & boost 1.31 설치 (Ver.0.2)
vc2005,mingw,cygwin설치법 - redwinki
VC++ 2005 에 boost library 32bit & 64bit 설치하기
1.35 vc프로젝트로 설치하기
vc++에 boost설치법
boost 라이브러리 설치방법
Visual Studio 2008에서 Boost 1.39 설치하기
letsboost::Install - 번역 최흥배



Boost Unit Test 설정

boost 소개 - redwiki
Boost Libraries

:

#include <iostream>
#include <sstream>
#include <fstream>

using namespace std;

int main (int argc, char **argv)
{
fstream stream;
stream.open("c:\\install.ini", ios::in);

if ( stream.is_open() )
{
stringstream ss;

ss << stream.rdbuf(); /* 이 시점에서 ss에 stream에 저장된 모든 내용이 복사됨. */
cout << ss.str() << endl;

ss.clear();
}

stream.close();
    return 0;
}

'프로그래밍 > C, C++' 카테고리의 다른 글

boost  (0) 2009.09.25
ASCII 문자 코드  (0) 2009.04.15
STLport 설치 및 사용 For VC6  (0) 2009.04.06
std::string, boost, CString::Format의 printf() 기능 사용 및 구현  (1) 2009.04.01
:

ASCII 문자 코드

프로그래밍/C, C++ | 2009. 4. 15. 09:29 | Posted by 99%
ASCII 문자 코드 차트 1

ASCII 문자 코드 차트 2

출처

http://msdn.microsoft.com/ko-kr/library/4z4t9ed1(VS.71).aspx

:

STLport 설치 및 사용 For VC6

프로그래밍/C, C++ | 2009. 4. 6. 10:57 | Posted by 99%

STLport Configuration Manual

STLport 인스톨 문서번역 (RedPixel 님의 STLport 설치 문서 )

VC 6++용 STLport의 빠른 설치 가이드 (More Effective C++ 의 역자인 곽용재님의 STLport 설치 문서 )

개요

VC6에 포함된 STL은 딩컴웨어의 라이브러리를 사용하고 있으며 C++표준이 된 해에 발표된 툴이라 그런지 STL관련 문제가 너무 많다. 그래서 VC6을 사용하는 STL사용자들은 VC에 STLPort를 설치해서 사용한다. 다행히 VC최신 버젼은 STL에 많은 지원을 해주고 있으며 STL관련 기능도 많이 추가되어서 기본 STL라이브러리를 사용해도 무방하다.

MS VC6/7 STL 구현의 문제점
Visual Studio 버전 별 STL 지원
VC6 의 STL Platform 을 쓰지 말아야 하는 이유 한가지

※ STLPort 라이브러리는 SGI(실리콘 그래픽스)의 STL을 여러 가지 운영체제 및 개발 도구에서 쓸 수 있도록 포팅한 것
으로(현존하는 거의 모든 플랫폼과 컴파일러를 지원), ANSI 표준안을 충실히 따르고 있으며 이외의 비표준 라이브러리도 충실히 구비해 놓고 있는 공개 라이브러리이다.

STLPort 설치방법


다운로드
http://sourceforge.net/projects/stlport

STLport 는 5.0 부터는 wrapper 모드(컴파일러의 iostream사용)를 더 이상 지원하지 않아서 STLport의 iostream을
사용해야한다.
이전버전을 사용할때 wrapper모드를 사용할꺼면 입출력관련 컴파일과정이 필요없다.

STLPort의 입출력라이브러리를 사용할때 VC 프로젝트에서 CRT라이브러리를 DLL로 사용하면 STLPort관련 DLL도 같이 배포 해야된다. 좀 불편한 사항이라 Static라이브러리를 기본으로 사용하게 컴파일하는 방법을 같이 설명한다. (필자는 5.1.5를 사용중인데 그전 4.6.2를 사용할때 Static라이브러리로 컴파일이 잘 안되서 5.1.5로 바꿨다. Static라이브러리에 대한 설명은 5.1.5에서만 설명하겠다.)

※ VC6에 최신 Platform SDK을 사용하면 VC용 입출력라이브러리를 그냥 사용해도 상관없다는 분도 계신데 sstream을 사용하려고 선언하기만 해도 102개의 error와 9개의 warning이 발생하니 필자는 사용안할수가 없었다. ㅡ.ㅡ; (4.6.2 사용시..)

STLPort 5.1.5, 5.2.0 설치

정적라이브러리(Static)로 사용방법은 아래 주석으로 표시한 두줄의 차이 밖에 없으며 configure에서 --rtl-dynamic 의미는 동적(dynamic) C,C++ 라이브러리 사용시 STLport를 정적으로(statically) 링크할 수 있도록 한다는 것이다. 위와 같이 설정하면 실제 컴파일된 결과물은 CRT라이브러리가 Multithread DLL설정으로 사용시 필요한 라이브러리만 생성되므로 아래 4,5번 과정을 --rtl-dynamic빼고 한번, 설정하고 한번으로 해서 컴파일하면 VC에서 CRT를 사용하는 3가지 쓰레드 모델에 모두 적용가능한 라이브러리를 만들수 있다.

STLPort를 다운받아서 압축을 푼다.

1. stlport\stl\config\user_config.h에서 아래값 설정
#define _STLP_NEW_PLATFORM_SDK   // Platform SDK를 사용하는 환경에서 사용
#define _STLP_USE_MFC                     // MFC 사용시

2. stlport\stl\host.h에 아래값 설정
#define _STLP_LEAKS_PEDANTIC 1
#define _STLP_USE_NEWALLOC 1
#define _STLP_USE_MALLOC 1


#define _STLP_USE_STATIC_LIB        // 정적(static) 라이브러리 사용시

3. cmd창을 띄우고 stlport폴더로 이동.

    cd build\lib를 입력

4. configure -c msvc6
    configure -c msvc6  --rtl-dynamic// 정적(static) 라이브러리 사용시는 --rtl-dynamic없이 4,5번 수행하고
                                                          --rtl-dynamic 설정하고 다시 4,5번 컴파일 과정을 반복한다. 

    ※ 5.2.0은 STLPort 루트폴더에 있고 '-c' 옵션은 configure설정에서 사라졌으므로 빼고 설정하면 된다.

-> configure --help로 도움말을 볼수 있다.

5. nmake /fmsvc.mak clean install

-> build\lib\readme 파일을 보면 nmake설정을 볼수 있다.

clean -> build\lib\obj폴더 내용삭제

install -> 컴파일해서 생성된 obj폴더의 내용을 stlport루트 폴더의 lib,bin으로 옮겨주는 작업까지를 말한다.

6. lib,bin폴더에 컴파일된 결과물이 생긴다.

확인후 lib 폴더 안에 파일을 ..\Microsoft Visual Studio\VC98\Lib안에 복사한다.

bin폴더 내용을 C:\Windows\System32에 복사한다.

7. ..\Microsoft Visual Studio\VC98\Include에 stlport 폴더를 복사한다.

8. VC++6에 경로 등록(가장 상위로 이동)

Include files: "..\Microsoft Visual Studio\VC98\stlport\include"


STLPort 4.6.2 설치

STLPort를 다운받아서 압축을 푼다.
1. stlport\
stl_user_config.h에서 아래값 설정
#define _STLP_NEW_PLATFORM_SDK 1 // Platform SDK를 사용하는 환경에서 사용
#define _STLP_USE_MFC                     // MFC 사용시

2-1. wrapper 모드로 사용하는 경우(컴파일러의 iostream 사용)
STLport에서 제공하는 iostream을 사용하지 않는 경우 컴파일할 필요가 없다.
- stl_user_config.h 파일의 # define _STLP_NO_OWN_IOSTREAMS 1 부분 주석 해제
- stlport 디렉터리를 ..\Microsoft Visual Studio\VC98\include에 복사
- VC++에서 Tool -> Option -> Directories -> include files 에 stlport 디렉터리 등록
- 위의 디렉터리를 상위로 설정하고 사용해야 STLport의 헤더 파일을 사용합니다.(설치 끝)

2.2. STLport의 iostream을 사용하는 경우
STLport 라이브러리를 컴파일해야 한다.
- 시작 버튼 메뉴의 Platform SDK 에 보면 Open Build Environment Window 라는 도스창 띄워주는 단축 아이콘이 있다. 이중에서 자신의 운영체제 맞는 것을 선택하여 도스창을 띄운다.
- STLport 압축을 푼 디렉터리에서 src 디렉터리로 이동
- nmake -f vc6.mak install (VC++ 6인 경우, 다른 컴파일의 경우 다른 make 파일 선택)
- 컴파일이 끝나면 헤더파일, lib(VC의 lib 디렉터리), dll(system32 디렉터리) 파일들이 설치된다.
- VC++에서 Tool -> Option -> Directories -> include files 에 stlport 디렉터리 상위로 설정 등록


문제 해결

위에서 _STLP_NEW_PLATFORM_SDK, _STLP_USE_MFC는 기본으로 설정해야 된다.

1. 설치시 error C2733 ... InterlockedIncrement... 에러가 발생한다.
(
c:\program files\microsoft visual studio\vc98\include\stlport\stl\_threads.h(122) :
    error C2733: second C linkage of overloaded function 'InterlockedIncrement' not allowed)

PlatformSDK 설치 후에 Visual Studio 6를 설치하거나 DirectX등을 설치할경우 IncludeSetting 에서Platform SDK Include Path 의 우선순위가 낮게 설정 되는데 Platform SDKInclude Path의우선순위를 제일 위로 올려주고
STLport-xxx\stlport\stl\config\stl_user_config.h 파일의 #define _STLP_NEW_PLATFORM_SDK 1
부분을 주석을 제거 해주시면 정상 처리 됩니다.

2. Visual C++ 에서 메모리 릭이 날 때?
stlport/stl/config/hosts.h에서
#define _STLP_LEAKS_PEDANTIC 1
#define _STLP_USE_NEWALLOC 1
#define _STLP_USE_MALLOC 1
를 설정해준다.

STLport에서 구현된 allocator로 인해 몇몇 릭을 검출하는 툴에서 메모리 릭이
발생하는데 진짜 메모리 누수로 생기는 릭이 아니라 릭을 검출하는 시점에 의해 생기는
잘못된 보고이다. 이러한 가짜 릭이 걱정된다면 이 전처리를 사용한다.
반드시 _STLP_USE_NEWALLOC 또는 _STLP_USE_MALLOC과 같이 사용해야 한다.



2009.10.11
이전엔 없던 에러가 발생한다. 예전에 받아논 STLPort파일(5.1.5)은 컴파일이 잘되는데 새로받은건 안된다;; 아직 해결못함.

NMAKE : fatal error U1077: 'cl' : return code '0x2'
-> 5.1.5에서 나는 에러다.

NMAKE : fatal error U1077: 'copy' : return code '0x1'

-> 5.2.0에서 나는 에러다.

참고
Visual C++ 2005에서 STLport 5.1.0 빌드 -> 컴파일 설정에 대한 자세한 설명
STLport 4.6.2,STLport 5.0.1,boost 1.33.1설치
STLPort 설치(윈도우즈 + Visual Studio C++ 7.0) v4.5.3

STLport 4.6.2 설치 방법 (참고사이트 볼것)
STLport 4.6.2 설치하기 & boost 1.31 설치 (Ver.0.2) (이택근님)

MSVC 플젝에서 STLPort사용(헤더파일 정의)

* 설치후 stlport 디렉토리를 컴파일러 설정에 추가한다.
(대개 C:/Program Files/Microsoft Visual Studio/VC98/include/stlport)
 추가하고 나서 이것을 첫 줄로 올립니다.

* 헤더파일 선언전에 아래껄 먼저 선언해라! VC6에서 4786 waring이 정신건강을 괴롭힌다 ㅡ.ㅡ;;
#pragma waring(disable : 4786)

1. stdafx.h에 선언하기
stdafx.h에 stl관련 헤더파일을 사용하겠다고 선언하면 2번과 같은 상황은 없다.

2. 일반 cpp파일에서 선언하기
#include <vector>를 #include "stdafx.h" 바로 밑줄에다 해보세요.
정확히 하자면

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

이거보다 전에 #include <vector>같이 stl헤더를 선언하면 된다.

:
기본 사용법

CString
CString str;
str.Format("%s%03d", szSomeVar, nSomeVar);

타입 안정성을 중요시하는 C++ 에서는 안타깝게도 CString의 Format 계열 함수가 제공 되지 않는다.
그래서 버퍼를 잡아 C의 런타임함수인 sprintf 함수를 사용하는수 밖에 없다.
그러나 C++에서는 stream 객체가 있으므로 sprintf 보다 우아(?) 하게 사용 할수 있다.

#include <sstream>로 사용할수 있으며 input/output/ input&output 버전이 따로 존재한다.

stringstream  in & out
ostringstream out
istringstream in

유니 코드 버전은 위의 클래스 네임에 w만 앞쪽에 붙여 주면되고
stringstream 내의 함수 중에 str() 멤버 함수로 string 클래스의 객체와 같이 연동해서 쓸 수 있다.

STL
#include <string>
#include <sstream>
#include <iomanip>
 
using namespace std;
ostringstream strStream;
strStream << szSomeVar << setw(3) << setfill('0') << nSomeVar;
string str = strStream.str();

BOOST
#include <boost/format.hpp>
#include <string>
 
std::string someString;
someString = boost::str(boost::format("%s%03d") % szSomeVar % nSomeVar);

CString의 Format에 해당하는 STL 코드와 BOOST 코드


직접 구현하기

1. 코드프로젝트
STL Format

CString의 Format같은 기능을 함수로 구현해 놓은게 있다.
근데 VC6에선 제대로 컴파일이 안된다. 우선 string의 clear는 stlport에는 없다.

2. 권진호님
sprintf 와 string 과의 만남

3. codein.co.kr

#define _MAX_CHARS 8000

int Format(std::string& txt, const TCHAR* szFormat,...)

{ 

    std::vector<TCHAR> _buffer(_MAX_CHARS);

    va_list argList;

    va_start(argList,szFormat);

#ifdef _UNICODE

    int ret = _vsnwprintf(&_buffer[0],_MAX_CHARS,szFormat,argList);

#else

    int ret = _vsnprintf(&_buffer[0],_MAX_CHARS,szFormat,argList);

#endif

    va_end(argList);

    txt.assign(&_buffer[0],ret);

    return ret;

}


4. 본인은 CString의 FromatV함수로 간단히 구현했음.  차라리 CString을 사용하는게 낫지 않냐고 하시면..
내부 구현은 나중에 제대로 테스트후 적용해도 된다. ㅋ

UINT StrPrintf( string& rstr, const char *pFmt, ...  )

    va_list args;
    va_start(args, pFmt);
   
    CString csMsg;
    csMsg.FormatV(pFmt, args);
    rstr = csMsg;
   
    va_end(args);
    return rstr.length();
}


'프로그래밍 > C, C++' 카테고리의 다른 글

boost  (0) 2009.09.25
stringstream 을 사용한 파일 읽기 사용 예제  (0) 2009.05.12
ASCII 문자 코드  (0) 2009.04.15
STLport 설치 및 사용 For VC6  (0) 2009.04.06
: