Notice»

Recent Post»

Recent Comment»

Recent Trackback»

Archive»

« 2024/3 »
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
31

 

'STL'에 해당되는 글 2

  1. 2009.04.24 Generics & Template(그리고 STL) 2
  2. 2009.04.06 STLport 설치 및 사용 For VC6
 

.NET2.0 에서 Generics 이란?


델파이2009에도 Generics가 추가 되었군요.
Template의 영향력이 크네요.
STL과 같은 구조의 라이브러리가 전언어에서 구현가능하겠군요.


찾게 되면 이곳에 정리 하겠습니다.

:

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헤더를 선언하면 된다.

: