1. Introduce

표준 STL 규격에 맞춰 STLPort 회사가 만든 표준템플릿 STL(Standard Template Language) 오픈소스로써 SGI STL에 기반하고 있음.

2. 설치법

http://www.kwak101.pe.kr/wiki/wiki.php/STLport_VCġ
본 문서는 상기의 페이지에 내용을 그대로 옮긴것입니다. 개인 홈페이지의 내용이기 때문에 링크가 깨질경우를 대비한 백업이므로 가능하면 원래의 페이지에서 보시길 바랍니다. 최소한의 원작자에 대한 예의이겠죠 ^^;;

3. 들어가기 전에

본 문서는 Win32 환경에서 Visual C++ 를 사용하시는 분들이 STLport의 STL 라이브러리를 설치하여 사용하는데 도움을 주기 위하여 작성되었습니다. 가장 최소한의 설치 과정만을 싣는데 초점을 두었으며, Visual C++ 6 이하의 버전에서는 테스트하지 않았음을 미리 알려 드립니다. 기타 세세한 정보는 외부 자료 문서화 페이지 혹은 게시판에서 얻고, 나누어 주시기 바랍니다. 감사합니다.

STLport 라이브러리는 SGI(실리콘 그래픽스)의 STL을 여러 가지 운영체제 및 개발 도구에서 쓸 수 있도록 포팅한 것으로, ANSI 표준안을 충실히 따르고 있으며 이외의 비표준 라이브러리도 충실히 구비해 놓고 있는 공개 라이브러리입니다. 게다가 몇가지 장점이 더 붙어 있습니다.

  1. 입출력스트림 라이브러리가 개선되었음.
  2. MSVC 컴파일러의 자질구레한 경고 메시지를 막을 수 있다 (~cpp _msvc_warnings_off.h가 준비되어 있음)

잘 아시겠지만, 본 문서는 읽으시는 분께서 Visual C++ 개발 환경과 C++ 사용에 불편해하지 않고 DOS 화면을 두려워하지 않는다는 가정 하에 작성했고, 윈도우 환경을 최대한 사용하는 쪽으로 작성하였습니다. :)

4. 라이브러리 받아 놓기

  1. STLport 패키지의 압축 파일을 받습니다. 현재의 최신 안정화 릴리즈는 4.6.2 (STLport-4.6.2.tar.gz)입니다.
    저는 예전 버전인 4.5.3을 그대로 사용하기로 했습니다. (빌드 및 사용방법에 차이가 없습니다)
  2. 만만해 보이는 디렉토리에 압축을 풉니다.(참고로, 제 Visual Studio는 D:\Programming Files2 에 있습니다)
    1-decompress.GIF
  1. 순서대로 간단히 디렉토리 설명을 드리면 다음과 같습니다. 일단 훑어만 보시죠.
    • doc : 라이브러리 설치 도움말 및 라이브러리 레퍼런스가 들어 있는 디렉토리.
    • etc : 말 그대로 기타 잡다구리한 파일들이 있는 디렉토리
    • lib : 컴파일된 STLport 재사용 바이너리(lib, dll)가 들어가는 디렉토리. (처음엔 없다가 나중에 생길겁니다.)
    • src: 재사용 바이너리를 빌드하기 위한 플랫폼 별 프로젝트 파일이 있는 디렉토리. (주의: vc6.mak 파일이 있는지 확인해 보세요. 빌드에 중요합니다)
    • stlport : STL 헤더와 바이너리 소스가 들어 있는 디렉토리. STLport 라이브러리의 몸통입니다.
    • test : STLport가 설치된 후 제대로 설치되었나 확인하기 위한 테스트 프로그램 소스.

5. 입출력스트림 라이브러리 컴파일하기

STLport 버전의 입출력 라이브러리를 만드는 과정입니다.알려진 바에 의하면, VC++에 들어 있는 기본(stock) 입출력스트림 라이브러리보다 이것이 더 성능이 좋고 안정적이라고 하지요.
  1. Visual C++를 열고, File > Open 메뉴로 src\vc6.mak 메이크파일을 읽어 들입니다.
    • 메이크 파일을 읽으면, 아래와 같은 대화 상자가 나와 "프로젝트를 만들겠냐고 물어 보는데, 당연히 하시고, 적당한 이름(예: STLP_vc6)을 짓죠. 프로젝트 파일인 .dsp와 .dsw가 만들어 지면서 재사용 바이너리를 빌드할 수 있게 됩니다.
      2-VC6mak_read.GIF
  2. 재사용 바이너리는 STLport 패키지에 있는 표준 C++ 헤더를 사용하여 빌드되므로, VC++이 이 헤더를 가장 먼저 참조할 수 있도록 해야 합니다. 따라서 이 짓을 해 줍시다.
    • Tools 메뉴 > Options 항목 > Directories 탭에서, Include Files 목록에 stlport 디렉토리를 추가하고 나서 이것을 첫 줄로 올립니다.
      3-prebuild_includePath.GIF
  3. 이제 Rebuild All을 하시든지 해서 라이브러리 빌드로 들어 갑니다,
    이때, stlport\new 헤더 파일의 2줄에서 에러를 일으키는 경우가 있는데요, 네임스페이스 std::를 붙여 주도록 합시다. (아래의 그림에서 if 다음의 2줄입니다)
  4. 4-compileError.GIF
  5. 이제 다시 빌드합니다( - -; ). 시스템에 따라 차이는 있을 수 있으나 1시간 정도 걸립니다.다음 그림은 빌드가 끝난 상태의 output 윈도우입니다.
    5-STLport_Lib.GIF
  6. 빌드한 라이브러리를 확인합니다. 별다른 조정을 해 주지 않았다면 아래와 같이 lib 디렉토리와 함께 만들어질 것입니다.

    6-postbuild.GIF
    • 기본적으로 만들어지는 라이브러리는 총 6개입니다. 이중 "stldebug"란 문자열이 들어 있는 라이브러리는 STLport 전용의 디버그 기능이 함께 들어 있는 버전입니다. 사용방법은 아래의 "디버그 기능 사용하기"에서 보십시오.
      • DLL은 debug/(release)의 2개입니다.
      • LIB은 debug/(release), debug_static/(release)_static의 4개입니다.

5.1. <!> 입출력 라이브러리를 빌드하지 않을 분들은?

이 절의 설명과 이후의 설명을 모두 건너 뛰시고, stlport 폴더 전체를 VC++ 폴더의 /include 폴더에 복사하십시오. 그리고 "프로그램 관련 세팅" 절부터 읽으시면 됩니다. 단, 라이브러리 관련 부분은 관련이 없습니다.

6. STLport 완전히 설치하기

만들어진 STLport의 재사용 바이너리와 표준 헤더를 비주얼 스튜디오에서 쓸 수 있도록 해주는 과정입니다.
  1. DOS 창을 열고, STLport 패키지가 풀린 위치를 기준으로 src 디렉토리(위에서 확인하셨죠?)를 찾아 갑니다.
    ~cpp   E:\STLport-4.5.3\src\ 
    
  2. 도스 프롬프트에서 nmake install을 입력합니다.
    ~cpp  E:\STLport-4.5.3\src\nmake -f vc6.mak install 
    
    • 시스템이 알고 있는 비주얼 스튜디오의 인클루드 패스와 라이브러리 패스에 STLport 헤더와 바이너리가 복사될 겁니다.

      7-makeInstall.GIF

7. 프로그래밍 관련 세팅

7.1. 최초 세팅: 인클루드 경로 조정

1. 비주얼 C++가 STLport의 헤더파일을 가장 먼저 참조할 수 있도록 인클루드 경로를 조정합니다.
  • Tools > Options 메뉴 > Directories 탭에서, Include Files 목록에 방금 추가된 stlport 디렉토리(대개 C:/Program Files/Microsoft Visual Studio/VC98/include/stlport이겠지요)를 추가하고 나서, 이 항목을 가장 첫 줄로 올립니다.

7.2. 런타임 라이브러리 조정하기

STLport는 상용이 아니기 때문에, 링크 시 사용하는 STLport 전용 C++ 런타임 라이브러리(입출력스트림이 있는) 직접 설정해 주어야 합니다. 이것을 제대로 이해하려면 우선 VC++가 사용하는 런타임 라이브러리를 알아 봐야 합니다. VC++6의 런타임 라이브러리는 VC98/lib 디렉토리에서 확인할 수 있는데, 정적/동적 링크여부에 따라 크게 ~cpp LIBxxx.lib 버전과 ~cpp MSVCxxx.lib 버전으로 나뉩니다. 프로젝트에서 조정하는 부분은 Project > Setting 메뉴로 열리는 C/C++ 탭입니다. C/C++ 탭에서 "Code Generation" 카테고리를 선택하면 Use Run-time Library 드롭다운 박스를 조정해 줄 수 있습니다. 여기서 디버그 정보 포함(debug) 유무, 런타임 라이브러리의 스레딩(thread) 모드, 동적 링크 여부(DLL)의 조합을 결정해 줄 수 있습니다. 긴 설명은 빼고, 간단히 정리하면 다음과 같습니다. (MSDN의 설명을 참고하여 정리하였습니다)
  • C 런타임 라이브러리 (iostream 없음) : VC++6 용
    "Use Run-time Library" 항목 이름 특징 컴파일 옵션 환경변수정의
    Single-Threaded LIBC.LIB 단일 스레드, 정적 링크 /ML
    Multithreaded LIBCMT.LIB 다중스레드, 정적 링크 /MT _MT
    Multithreaded DLL MSVCRT.LIB 다중스레드, 동적링크 /MD _MT, _DLL
    • Debug 버전의 경우엔 각 런타임Lib 항목에 "Debug"란 문자열이 붙고, 각 이름의 .LIB앞에 "D"가 붙고, 각 환경변수에 "_DEBUG"가 추가됩니다.
  • 표준 C++ 라이브러리 : VC++6 용
    "Use Run-time Library" 항목이름 특징 컴파일 옵션 환경변수정의
    Single-Threaded LIBCP.LIB 단일 스레드, 정적 링크 /ML
    Multithreaded LIBCPMT.LIB 다중 스레드, 정적 링크 /MT _MT
    Multithreaded DLL MSVCPRT.LIB 다중 스레드, 동적 링크 /MD _MT, _DLL
    • 역시 마찬가지로, Debug 버전의 경우엔 각 런타임Lib 항목에 "Debug"란 문자열이 붙고, 각 이름의 .LIB앞에 "D"가 붙고, 각 환경변수에 "_DEBUG"가 추가됩니다.
이렇기 때문에, STLport용 C++ 라이브러리도 여기에 맞춰 줘야 합니다. 세 개의 매크로 상수를 사용할 수 있습니다.
  • STLport의 라이브러리 선택: VC++6용
    정의한 매크로 상수대응되는 "Use Run-time Library" 설정링크되는 STLport 런타임 라이브러리
    _STLP_USE_STATIC_LIB <*><*threaded> stlport_vc6_static.lib
    _STLP_USE_DYNAMIC_LIB <*><*threaded> DLL stlport_vc6.lib
    _STLP_USE_STATICX_LIB <*><*threaded><*> "DLL"이면 stlport_vc6.lib, 아니면 stlport_vc6_static.lib

7.3. <!> 런타임 라이브러리 세팅이 잘 안될 때

_STLP_USE_STATIC_LIB 상수를 정의한 후에 "Use Run-time Library" 설정을 <*><*threaded>으로 맞춘 뒤에도 ~cpp LNK2005 에러와 ~cpp LNK4098 경고가 동시에 나는 경우가 있습니다. 이런 에러가 나올 것입니다.
~cpp 
 LIBCMT.lib(osfinfo.obj) : error LNK2005: __alloc_osfhnd already defined in LIBC.lib(osfinfo.obj)
 LIBCMT.lib(osfinfo.obj) : error LNK2005: __set_osfhnd already defined in LIBC.lib(osfinfo.obj)
 .
 .
 .
 LINK : warning LNK4098: defaultlib "LIBCMT" conflicts with use of other libs; use /NODEFAULTLIB:library
 <실행파일경로> : fatal error LNK1169: one or more multiply defined symbols found
 Error executing link.exe.
이는, VC가 코드 생성 옵션을 무시하고 LIBCMT.lib을 기본적으로 덧대어 넣어주기 때문입니다. 실행파일을 만드는 경우라면 에러가 가장 성가실 테지만, 배포용 라이브러리를 만들 경우엔 경고도 없애 주어야 합니다. 이 에러와 경고를 없애기 위해서는, 위에 나온 링커 메시지 대로 /NODEFAULTLIB 옵션을 써야 합니다. VC IDE를 쓰고 계시다면 Project->Setting 메뉴를 선택하고 나오는 대화상자에서 "Link" 탭을 선택하시고, "Input" 드롭다운 항목을 고른 후에 "Ignore Libraries" 에디트 상자에 LIBCMT.lib를 써 넣으시면 됩니다.
이외에도, 기본 런타임 라이브러리와 관련된 내용의 URL을 첨부하니, 참고하시기 바랍니다.
  • 관련 MSDN 링크(http://msdn.microsoft.com/library/kor/default.asp?url=/library/KOR/vccore/html/LNK4098.asp)

7.4. 디버그 기능 사용하기

STLport에는 자체 라이브러리에서 자체 디버그 정보를 내어 주는 독특한 기능을 가지고 있습니다. 보충설명은 이펙티브 STL의 항목 50을 참고하십시오. 여기서는 STLport의 디버그 기능을 활성화하는 방법만 설명합니다.말은 거창하지만, 본론은 간단합니다. 가장 먼저 컴파일되는 파일(.h/.cpp)의 앞부분에 다음과 같이
~cpp 
#define _STLP_DEBUG
_STLP_DEBUG란 심볼을 정의해 두면 됩니다. 이렇게 하면, "stldebug" 문자열이 포함된 lib과 DLL이 사용됩니다.

8. 테스트

이제 다 끝났습니다. STLport가 제대로 설치되었는지 확인하는 의미에서, 패키지에 들어 있는 메이크 파일을 Visual C++을 사용하여 읽은 후에 빌드해 보세요.
~cpp  test\eh\vc6.mak
 test\regression\vc6.mak
자동으로 테스트까지 해 줄 겁니다.

9. 문제 해결

9.1. nmake에 문제가 있을 경우

만약에 nmake가 실행되는 데 문제가 있거나 라이브러리 설치가 제대로 되어 있지 않다면, 비주얼 스튜디오에 관련된 환경 변수가 시스템에 제대로 등록되지 않은 이유가 대부분입니다. 그러므로, VCVARS32.BAT를 실행한 후에 다시 nmake install을 해 보세요.

9.2. 플랫폼 SDK과 같이 사용할 경우 "InterlockedIncrement" 관련 컴파일 에러가 날 때

생기는 에러는 이런 류의 메시지입니다:
~cpp 
e:\microsoft visual studio\vc98\include\stlport\stl\_threads.h(122) : 
error C2733: second C linkage of overloaded function 'InterlockedIncrement' not allowed 
e:\microsoft visual studio\vc98\include\stlport\stl\_threads.h(122) : see declaration of 
'InterlockedIncrement' 
이 컴파일 에러를 막으려면, STLport가 설치된 디렉토리(대개 C:/Program Files/Microsoft Visual Studio/VC98/include/stlport이겠지요) 에서 stl_user_config.h를 찾아 열고, 다음 부분을 주석 해제합니다.
~cpp 
// # define _STLP_NEW_PLATFORM_SDK 1  

10. 문서 정보

  • 최초 작성 날짜 :2002/03/02
  • 최종 업데이트 날짜 : 이 페이지 아래에 있는 "last modified"에 나와 있음
  • 적용 플랫폼 : Win32 / VC++ 6
  • 작성자 : 곽용재 (kwak101@hitel.net)

Retrieved from http://wiki.zeropage.org/wiki.php/STLPort
last modified 2021-02-07 05:27:57