Contents
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 표준안을 충실히 따르고 있으며 이외의 비표준 라이브러리도 충실히 구비해 놓고 있는 공개 라이브러리입니다. 게다가 몇가지 장점이 더 붙어 있습니다.
- 입출력스트림 라이브러리가 개선되었음.
- MSVC 컴파일러의 자질구레한 경고 메시지를 막을 수 있다 (
~cpp _msvc_warnings_off.h
가 준비되어 있음)
4. 라이브러리 받아 놓기 ¶
- STLport 패키지의 압축 파일을 받습니다. 현재의 최신 안정화 릴리즈는 4.6.2 (STLport-4.6.2.tar.gz)입니다.
저는 예전 버전인 4.5.3을 그대로 사용하기로 했습니다. (빌드 및 사용방법에 차이가 없습니다)
- 만만해 보이는 디렉토리에 압축을 풉니다.(참고로, 제 Visual Studio는 D:\Programming Files2 에 있습니다)
- 순서대로 간단히 디렉토리 설명을 드리면 다음과 같습니다. 일단 훑어만 보시죠.
- doc : 라이브러리 설치 도움말 및 라이브러리 레퍼런스가 들어 있는 디렉토리.
- etc : 말 그대로 기타 잡다구리한 파일들이 있는 디렉토리
- lib : 컴파일된 STLport 재사용 바이너리(lib, dll)가 들어가는 디렉토리. (처음엔 없다가 나중에 생길겁니다.)
- src: 재사용 바이너리를 빌드하기 위한 플랫폼 별 프로젝트 파일이 있는 디렉토리. (주의: vc6.mak 파일이 있는지 확인해 보세요. 빌드에 중요합니다)
- stlport : STL 헤더와 바이너리 소스가 들어 있는 디렉토리. STLport 라이브러리의 몸통입니다.
- test : STLport가 설치된 후 제대로 설치되었나 확인하기 위한 테스트 프로그램 소스.
- doc : 라이브러리 설치 도움말 및 라이브러리 레퍼런스가 들어 있는 디렉토리.
5. 입출력스트림 라이브러리 컴파일하기 ¶
STLport 버전의 입출력 라이브러리를 만드는 과정입니다.알려진 바에 의하면, VC++에 들어 있는 기본(stock) 입출력스트림 라이브러리보다 이것이 더 성능이 좋고 안정적이라고 하지요.
- Visual C++를 열고, File > Open 메뉴로 src\vc6.mak 메이크파일을 읽어 들입니다.
- 메이크 파일을 읽으면, 아래와 같은 대화 상자가 나와 "프로젝트를 만들겠냐고 물어 보는데, 당연히 예 하시고, 적당한 이름(예: STLP_vc6)을 짓죠. 프로젝트 파일인 .dsp와 .dsw가 만들어 지면서 재사용 바이너리를 빌드할 수 있게 됩니다.
- 메이크 파일을 읽으면, 아래와 같은 대화 상자가 나와 "프로젝트를 만들겠냐고 물어 보는데, 당연히 예 하시고, 적당한 이름(예: STLP_vc6)을 짓죠. 프로젝트 파일인 .dsp와 .dsw가 만들어 지면서 재사용 바이너리를 빌드할 수 있게 됩니다.
- 재사용 바이너리는 STLport 패키지에 있는 표준 C++ 헤더를 사용하여 빌드되므로, VC++이 이 헤더를 가장 먼저 참조할 수 있도록 해야 합니다. 따라서 이 짓을 해 줍시다.
- 이제 Rebuild All을 하시든지 해서 라이브러리 빌드로 들어 갑니다,
이때, stlport\new 헤더 파일의 2줄에서 에러를 일으키는 경우가 있는데요, 네임스페이스 std::를 붙여 주도록 합시다. (아래의 그림에서 if 다음의 2줄입니다)
- 이제 다시 빌드합니다( - -; ). 시스템에 따라 차이는 있을 수 있으나 1시간 정도 걸립니다.다음 그림은 빌드가 끝난 상태의 output 윈도우입니다.
- 빌드한 라이브러리를 확인합니다. 별다른 조정을 해 주지 않았다면 아래와 같이 lib 디렉토리와 함께 만들어질 것입니다.
- 기본적으로 만들어지는 라이브러리는 총 6개입니다. 이중 "stldebug"란 문자열이 들어 있는 라이브러리는 STLport 전용의 디버그 기능이 함께 들어 있는 버전입니다. 사용방법은 아래의 "디버그 기능 사용하기"에서 보십시오.
- DLL은 debug/(release)의 2개입니다.
- LIB은 debug/(release), debug_static/(release)_static의 4개입니다.
- DLL은 debug/(release)의 2개입니다.
- 기본적으로 만들어지는 라이브러리는 총 6개입니다. 이중 "stldebug"란 문자열이 들어 있는 라이브러리는 STLport 전용의 디버그 기능이 함께 들어 있는 버전입니다. 사용방법은 아래의 "디버그 기능 사용하기"에서 보십시오.
5.1. 입출력 라이브러리를 빌드하지 않을 분들은? ¶
이 절의 설명과 이후의 설명을 모두 건너 뛰시고, stlport 폴더 전체를 VC++ 폴더의 /include 폴더에 복사하십시오. 그리고 "프로그램 관련 세팅" 절부터 읽으시면 됩니다. 단, 라이브러리 관련 부분은 관련이 없습니다.
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"가 추가됩니다.
- 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"가 추가됩니다.
- 역시 마찬가지로, Debug 버전의 경우엔 각 런타임Lib 항목에 "Debug"란 문자열이 붙고, 각 이름의 .LIB앞에 "D"가 붙고, 각 환경변수에 "_DEBUG"가 추가됩니다.
7.3. 런타임 라이브러리 세팅이 잘 안될 때 ¶
_STLP_USE_STATIC_LIB 상수를 정의한 후에 "Use Run-time Library" 설정을 <*><*threaded>으로 맞춘 뒤에도
이외에도, 기본 런타임 라이브러리와 관련된 내용의 URL을 첨부하니, 참고하시기 바랍니다.
~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을 첨부하니, 참고하시기 바랍니다.
8. 테스트 ¶
이제 다 끝났습니다. STLport가 제대로 설치되었는지 확인하는 의미에서, 패키지에 들어 있는 메이크 파일을 Visual C++을 사용하여 읽은 후에 빌드해 보세요.
~cpp test\eh\vc6.mak test\regression\vc6.mak자동으로 테스트까지 해 줄 겁니다.
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