[[TableOfContents]] = Introduce = 표준 STL 규격에 맞춰 STLPort 회사가 만든 표준템플릿 STL(Standard Template Language) 오픈소스로써 SGI STL에 기반하고 있음. = 설치법 = http://www.kwak101.pe.kr/wiki/wiki.php/STLport_VC%BC%B3%C4%A1 본 문서는 상기의 페이지에 내용을 그대로 옮긴것입니다. 개인 홈페이지의 내용이기 때문에 링크가 깨질경우를 대비한 백업이므로 가능하면 원래의 페이지에서 보시길 바랍니다. 최소한의 원작자에 대한 예의이겠죠 ^^;; = 들어가기 전에 = 본 문서는 Win32 환경에서 Visual C++ 를 사용하시는 분들이 STLport의 STL 라이브러리를 설치하여 사용하는데 도움을 주기 위하여 작성되었습니다. 가장 최소한의 설치 과정만을 싣는데 초점을 두었으며, Visual C++ 6 이하의 버전에서는 테스트하지 않았음을 미리 알려 드립니다. 기타 세세한 정보는 외부 자료 문서화 페이지 혹은 게시판에서 얻고, 나누어 주시기 바랍니다. 감사합니다. STLport 라이브러리는 SGI(실리콘 그래픽스)의 STL을 여러 가지 운영체제 및 개발 도구에서 쓸 수 있도록 포팅한 것으로, ANSI 표준안을 충실히 따르고 있으며 이외의 비표준 라이브러리도 충실히 구비해 놓고 있는 공개 라이브러리입니다. 게다가 몇가지 장점이 더 붙어 있습니다. 1. 입출력스트림 라이브러리가 개선되었음. 1. MSVC 컴파일러의 자질구레한 경고 메시지를 막을 수 있다 ({{{~cpp _msvc_warnings_off.h}}}가 준비되어 있음) 잘 아시겠지만, 본 문서는 읽으시는 분께서 Visual C++ 개발 환경과 C++ 사용에 불편해하지 않고 DOS 화면을 두려워하지 않는다는 가정 하에 작성했고, 윈도우 환경을 최대한 사용하는 쪽으로 작성하였습니다. :) = 라이브러리 받아 놓기 = 1. STLport 패키지의 압축 파일을 받습니다. 현재의 최신 안정화 릴리즈는 4.6.2 (STLport-4.6.2.tar.gz)입니다. 저는 예전 버전인 4.5.3을 그대로 사용하기로 했습니다. (빌드 및 사용방법에 차이가 없습니다) http://www.stlport.org/download.html 1. 만만해 보이는 디렉토리에 압축을 풉니다.(참고로, 제 Visual Studio는 D:\Programming Files2 에 있습니다) Upload:1-decompress.GIF 1. 순서대로 간단히 디렉토리 설명을 드리면 다음과 같습니다. 일단 훑어만 보시죠. * '''doc''' : 라이브러리 설치 도움말 및 라이브러리 레퍼런스가 들어 있는 디렉토리. * '''etc''' : 말 그대로 기타 잡다구리한 파일들이 있는 디렉토리 * '''lib''' : 컴파일된 STLport 재사용 바이너리(lib, dll)가 들어가는 디렉토리. (처음엔 없다가 나중에 생길겁니다.) * '''src''': 재사용 바이너리를 빌드하기 위한 플랫폼 별 프로젝트 파일이 있는 디렉토리. (''주의: vc6.mak 파일이 있는지 확인해 보세요. 빌드에 중요합니다'') * '''stlport''' : STL 헤더와 바이너리 소스가 들어 있는 디렉토리. STLport 라이브러리의 몸통입니다. * '''test''' : STLport가 설치된 후 제대로 설치되었나 확인하기 위한 테스트 프로그램 소스. = 입출력스트림 라이브러리 컴파일하기 = STLport 버전의 입출력 라이브러리를 만드는 과정입니다.알려진 바에 의하면, VC++에 들어 있는 기본(stock) 입출력스트림 라이브러리보다 이것이 더 성능이 좋고 안정적이라고 하지요. 1. Visual C++를 열고, File > Open 메뉴로 src\vc6.mak 메이크파일을 읽어 들입니다. * 메이크 파일을 읽으면, 아래와 같은 대화 상자가 나와 "프로젝트를 만들겠냐고 물어 보는데, 당연히 [예] 하시고, 적당한 이름(예: STLP_vc6)을 짓죠. 프로젝트 파일인 .dsp와 .dsw가 만들어 지면서 재사용 바이너리를 빌드할 수 있게 됩니다. Upload:2-VC6mak_read.GIF 1. 재사용 바이너리는 STLport 패키지에 있는 표준 C++ 헤더를 사용하여 빌드되므로, VC++이 이 헤더를 가장 먼저 참조할 수 있도록 해야 합니다. 따라서 이 짓을 해 줍시다. * Tools 메뉴 > Options 항목 > Directories 탭에서, Include Files 목록에 stlport 디렉토리를 추가하고 나서 이것을 첫 줄로 올립니다. Upload:3-prebuild_includePath.GIF 1. 이제 Rebuild All을 하시든지 해서 라이브러리 빌드로 들어 갑니다, 이때, stlport\new 헤더 파일의 2줄에서 에러를 일으키는 경우가 있는데요, 네임스페이스 std::를 붙여 주도록 합시다. (아래의 그림에서 if 다음의 2줄입니다) Upload:4-compileError.GIF 1. 이제 다시 빌드합니다( - -; ). 시스템에 따라 차이는 있을 수 있으나 1시간 정도 걸립니다.다음 그림은 빌드가 끝난 상태의 output 윈도우입니다. Upload:5-STLport_Lib.GIF 1. 빌드한 라이브러리를 확인합니다. 별다른 조정을 해 주지 않았다면 아래와 같이 lib 디렉토리와 함께 만들어질 것입니다. Upload:6-postbuild.GIF * 기본적으로 만들어지는 라이브러리는 총 6개입니다. 이중 "stldebug"란 문자열이 들어 있는 라이브러리는 STLport 전용의 디버그 기능이 함께 들어 있는 버전입니다. 사용방법은 아래의 "디버그 기능 사용하기"에서 보십시오. * DLL은 debug/(release)의 2개입니다. * LIB은 debug/(release), debug_static/(release)_static의 4개입니다. == 입출력 라이브러리를 빌드하지 않을 분들은? == 이 절의 설명과 이후의 설명을 모두 건너 뛰시고, '''stlport''' 폴더 전체를 VC++ 폴더의 /include 폴더에 복사하십시오. 그리고 "프로그램 관련 세팅" 절부터 읽으시면 됩니다. 단, 라이브러리 관련 부분은 관련이 없습니다. = STLport 완전히 설치하기 = 만들어진 STLport의 재사용 바이너리와 표준 헤더를 비주얼 스튜디오에서 쓸 수 있도록 해주는 과정입니다. 1. DOS 창을 열고, STLport 패키지가 풀린 위치를 기준으로 src 디렉토리(위에서 확인하셨죠?)를 찾아 갑니다. {{{~cpp E:\STLport-4.5.3\src\ }}} 1. 도스 프롬프트에서 nmake install을 입력합니다. {{{~cpp E:\STLport-4.5.3\src\nmake -f vc6.mak install }}} * 시스템이 알고 있는 비주얼 스튜디오의 인클루드 패스와 라이브러리 패스에 STLport 헤더와 바이너리가 복사될 겁니다. Upload:7-makeInstall.GIF = 프로그래밍 관련 세팅 = == 최초 세팅: 인클루드 경로 조정 == 1. 비주얼 C++가 STLport의 헤더파일을 가장 먼저 참조할 수 있도록 인클루드 경로를 조정합니다. * Tools > Options 메뉴 > Directories 탭에서, Include Files 목록에 방금 추가된 stlport 디렉토리(대개 ''C:/Program Files/Microsoft Visual Studio/VC98/include/stlport''이겠지요)를 추가하고 나서, 이 항목을 가장 첫 줄로 올립니다. == 런타임 라이브러리 조정하기 == 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 || == 런타임 라이브러리 세팅이 잘 안될 때 == _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을 첨부하니, 참고하시기 바랍니다. * [http://msdn.microsoft.com/library/kor/default.asp?url=/library/KOR/vccore/html/LNK4098.asp 관련 MSDN 링크] == 디버그 기능 사용하기 == STLport에는 자체 라이브러리에서 자체 디버그 정보를 내어 주는 독특한 기능을 가지고 있습니다. 보충설명은 [wiki:ESTL 이펙티브 STL]의 항목 50을 참고하십시오. 여기서는 STLport의 디버그 기능을 활성화하는 방법만 설명합니다.말은 거창하지만, 본론은 간단합니다. 가장 먼저 컴파일되는 파일(.h/.cpp)의 앞부분에 다음과 같이 {{{~cpp #define _STLP_DEBUG }}} _STLP_DEBUG란 심볼을 정의해 두면 됩니다. 이렇게 하면, "stldebug" 문자열이 포함된 lib과 DLL이 사용됩니다. = 테스트 = 이제 다 끝났습니다. STLport가 제대로 설치되었는지 확인하는 의미에서, 패키지에 들어 있는 메이크 파일을 Visual C++을 사용하여 읽은 후에 빌드해 보세요. {{{~cpp test\eh\vc6.mak test\regression\vc6.mak }}} 자동으로 테스트까지 해 줄 겁니다. = 문제 해결 = == nmake에 문제가 있을 경우 == 만약에 nmake가 실행되는 데 문제가 있거나 라이브러리 설치가 제대로 되어 있지 않다면, 비주얼 스튜디오에 관련된 환경 변수가 시스템에 제대로 등록되지 않은 이유가 대부분입니다. 그러므로, VCVARS32.BAT를 실행한 후에 다시 nmake install을 해 보세요. == 플랫폼 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 }}} = 문서 정보 = * 최초 작성 날짜 :2002/03/02 * 최종 업데이트 날짜 : 이 페이지 아래에 있는 "last modified"에 나와 있음 * 적용 플랫폼 : Win32 / VC++ 6 * 작성자 : 곽용재 (kwak101@hitel.net) ---- [STL]