1 Content 2 3 Q1 About STLport and availability 4 5 Q1.0 What is STLport? 6 Q1.1 What are the benefits from using STLport? 7 Q1.2 What versions of STLport are available? 8 Q1.3 Where is the documentation or user guide? 9 Q1.4 What is the version policy? 10 11 Q2 General 12 13 Q2.0 Do I need a C++ compiler? 14 Q2.1 Do I need runtime libraries from C++ compiler? 15 Q2.2 Can I use containers and algorithms from STLport and iostreams from 16 library that ship with my compiler? 17 Q2.3 Can I mix STL implementations in my project? 18 Q2.4 When I switch to STLport in my application, I get errors. Is STLport 19 so bad? 20 21 Q3 Building 22 23 Q3.0 On my XXXX Linux n.n g++ headers are in /usr/include/g++, but they 24 are looked for in /usr/include/3.3.1. Is it a STLport bug? 25 Q3.1 Do I need to build library to use STLport? 26 Q3.2 During library compilation with MS VC++ 6.0 I see following error report:... 27 Q3.3 Has anybody succeeded building STLport on OS Y with compiler K n.n? 28 Q3.4 Does STLport support cross-compilation? 29 30 Q4 Installation 31 32 Q4.1 I tried "make -f gcc.mak install", but it install nothing into 33 /usr/local/. How I can install headers into /usr/local/include and 34 libs into /usr/local/lib? 35 36 Q5 Bug report 37 38 Q5.0 I found a bug, how can I report about it? 39 40 Q6 Design 41 42 Q6.0 In STLport, files like locale.h, setjmp.h, stdlib.h, etc., 43 do nothing except include native headers. Why are these files present in STLport? 44 Q6.1 Is STLport a replacement for headers and libraries that shipout 45 with compiler? 46 Q6.2 My tool detects memory leaks in applications with STLport. Is this leak 47 from STLport? 48 Q6.3 When running unit tests, I have errors in LocaleTest test fixture, how bad 49 is it? 50 Q6.4 set or multiset iterators are immutable like const_iterators, why ? 51 52 Answers 53 54 ======================================================================== 55 56 Q1.0 What is STLport? 57 A1.0 STLport is an implementation of the C++ Standard Library, as described 58 in the INTERNATIONAL STANDARD ISO/IEC 14882:1998(E) and latest 59 ISO/IEC 14882:2003(E). 60 61 ======================================================================== 62 63 Q1.1 What are the benefits from using STLport? 64 65 A1.1 66 - For multiplatform/multicompilers project a coherent Standard Library 67 implementation. 68 - An easy to use STL safe mode detecting bad use of containers and 69 iterators. 70 - Some original optimizations: template expression for string 71 concatenation, short string optimization, move semantic for STL containers 72 combination like vector of vector, an efficient std::allocator. 73 74 ======================================================================== 75 76 Q1.2 What versions of STLport are available? 77 78 A1.2 79 80 ======================================================================== 81 82 Q1.3 Where is the user guide? 83 84 A1.3 There is no real user guide for the moment. You can find some information 85 in README files in doc folder. As STLport is a C++ Standard library 86 implementation you might find information you need at the following 87 locations: 88 - The ISO/IEC 14882:2003 document you can buy for a very cheap price. 89 - For STL containers you can use SGI documentation (http://www.sgi.com/tech/stl/). 90 Beware however, STL described in this document is not identical to the 91 Standardized version described in ISO/IEC. This documentation can be very 92 useful for STLport extensions like hash containers (hash_map, hash_set...) 93 - You can also use the documentation coming with your compiler as most 94 of the information will also apply to STLport. Take care to description 95 reported as 'implementation specific'. 96 97 ======================================================================== 98 99 Q1.4 What is the version policy? 100 101 A1.4 STLport version information contains three numbers like '5.1.0'. '5' 102 is the major version number, '1' is the minor and '0' is the patch level. 103 Policy for this numbers are: 104 - changes in major version number: radical modification, new era. 105 - changes in minor version number: significant changes, new features, 106 changes in interface part; switching to an STLport library with a different 107 minor version require recompilation of all modules depending on it. 108 - changes in patch level: bugfixes; we keep in mind binary compatibility, 109 but really can't strongly guarantee it; switching to an STLport library 110 with different patch level do not require rebuild of modules---rebuilding and 111 installing the STLport libraries should work; however, as STLport contains 112 a lot of template code, you should pay attention to fact that all you modules 113 was build with SAME STLport headers---otherwise problems possible; 114 recompilation of one part with only rebuilding STLport might not be enough 115 to get all the fixes in your application so even in this case rebuilding 116 your modules is advised. 117 118 ======================================================================== 119 120 121 Q2.0 Do I need a C++ compiler? 122 123 A2.0 STLport is a C++ library. So the answer is 'yes, you do'. 124 125 ======================================================================== 126 127 Q2.1 Do I need runtime libraries from C++ compiler? 128 129 A2.1 In any case, the C++ language support from compiler is required 130 for STLport (operators new, delete, RTTI, exceptions support). That's why 131 in most cases you need some runtime libraries from the C++ compiler. 132 133 ======================================================================== 134 135 Q2.2 Can I use containers and algorithms from STLport and iostreams from 136 the library that ships with my compiler? 137 138 A2.2 The short answer is 'No'. 139 140 Indeed co-existence of two implementations possible, but this required 141 a lot of knowledge as about both implementations, as about compiler and 142 linkage. This issues should be taken into account both within STL library and 143 during library usage. In common you can't use both implementation 144 in the same namespace. So you should separate STL implementations into 145 different namespaces. But due to absent of compilers that has full-featured 146 support of Argument Dependent Lookup (ADL) (aka Koenig Lookup), you have no 147 possibilty to select one or another implementation. 148 149 ADL problem. 150 151 In wrapper mode, all std references are replaced, thanks a simple macro, 152 by the stlp_std namespace. Everything from the native compiler std namespace 153 is injected to the stlp_std namespace with many using std::* directives. 154 155 The problem arise when you specialized a standard class for one of your 156 user types. You do it within the std namespace that, in wrapper mode 157 becomes the stlp_std namespace. Then this specialization is just invisible 158 from the native std namespace and won't be used. 159 160 Things are somewhat worse: the problem arises even without any explicit 161 specializations. It is not a bug, but the fact that old compilers just 162 did not tried to find functions in the namespaces where arguments' classes 163 are defined (indeed no compilers with full-featured support of ADL yet). 164 165 Mix implementation via library. 166 167 Let's reduce all the complexity of STLport to some very simple example: 168 169 namespace std { 170 171 class string 172 { 173 public: 174 class iterator { }; 175 176 iterator begin(); 177 iterator end(); 178 }; 179 180 template<class I, class T> 181 void find(I begin, I end, T value); 182 183 } // namespace std 184 185 186 namespace stlport { 187 188 using std::string; 189 190 template<class I, class T> 191 void find(I begin, I end, T value); 192 193 void gee() 194 { 195 string s; 196 find(s.begin(), s.end(), 10); 197 } 198 199 } // namespace stlport 200 201 202 When a compiler supporting ADL finds the call to `find' within gee() function 203 it should examine both namespace `stlport' and namespace `std' for 204 the presence of `find'. It is caused by the fact that s.begin() returns 205 object of type `std::string::iterator' which obviously defined in namespace 206 `std' and the heart of ADL is finding functions not only within namespaces 207 where the call is being made but also in the namespaces where the classes 208 of arguments are defined... 209 210 So, in our example compiler ends with two templates satisfying the call 211 `find(s.begin(), s.end(), 10)': `std::find' and `stlport::find'. 212 Since compiler can not choose any one of them it reports ambiguity. 213 214 There is another aspect of mix implementations. 215 Let's consider following code: 216 217 a.h: 218 219 #include <string> 220 221 class A { 222 public: 223 A() {} 224 225 void push( const string s ); 226 227 string _str; 228 }; 229 230 a.cpp: 231 232 #include "a.h" 233 234 void A::push( const string s ) 235 { 236 _str = s; 237 } 238 239 240 b.cpp: 241 242 #include "a.h" 243 244 string s; 245 A a; 246 247 void gee() 248 { 249 a.push( s ); 250 } 251 252 Now build library from a.cpp with string implementation Impl1; 253 then build application with b.cpp that use string implementation Impl2, 254 and link with mentioned above library. Compiler will pass. Linker may 255 pass too. But your application will crash (or randomly crash) either on 256 call a.push, or on assignment _str = s. This is evident here, but not 257 evident in real applications. 258 259 The conclusion is: "Using Wrapper mode is very hard and we removed support 260 for it". 261 262 ======================================================================== 263 264 Q2.3 Can I mix STL implementations in my project? 265 266 A2.3 Yes you can but each implementations will rely in its own namespace 267 with no direct interaction between them. You will first need to correctly 268 configure STLport thanks to 2 macros in user_config.h file. 269 - _STLP_DONT_REDEFINE_STD tells STLport not to define the std macro that is 270 used to replace std reference in your code with STLport namespace. 271 - _STLP_WHOLE_NATIVE_STD tells STLport to always include native header each 272 time a Standard header is included in your code. 273 274 Here is a small code sample that do not require any modification in STLport 275 install: 276 277 #define _STLP_DONT_REDEFINE_STD 278 #define _STLP_WHOLE_NATIVE_STD 279 280 #include <string> 281 282 void foo() 283 { 284 std::string std_str("std"); 285 stlport::string stlport_str("stlport"); 286 stlport_str.append(std_str.begin(), std_str.end()); 287 // Following is wrong because there is no assignment 288 // operator for stlport::string on std::string. 289 //std_str = stlport_str; 290 } 291 292 Note: You can use 'std' iterators from native implementation in STLport 293 template methods like in the 'stlport_str.append' method call above because 294 STLport is adding the necessary code to interpret native iterators like 295 STLport iterators. You won't be able however to do the opposite as native 296 implementation do not know anything about STLport iterators. 297 298 299 ======================================================================== 300 301 Q2.4 When I switch to STLport in my application, I get errors. Is STLport 302 so bad? 303 304 A2.4 Before you post such message, please, check STLport WHITHOUT YOUR code: 305 - build STLport library 306 - build STLport unit tests 307 - run STLport unit tests 308 If any of above steps fail, please, make sure that you carefully followed 309 build instructions (in most cases you definitely should reread 310 instructions and check that you correctly unpack archive in case you see 311 'file not found' message). Build instructions you can found in files 312 INSTALL, doc/README.*, build/README*, build/test/unit/README*. 313 If you are sure, submit bug report here: 314 https://sourceforge.net/projects/stlport 315 Don't forget to describe your operational environment, compiler version and 316 STLport version. 317 318 ======================================================================== 319 320 Q3.0 On my XXXX Linux n.n g++ headers are in /usr/include/g++, but they 321 are looked for in /usr/include/3.3.1. Is it a STLport bug? 322 323 A3.0 Path to native compiler headers for GCC correspond to default path 324 after build/install compiler (i.e. paths from compiler origo). 325 Package maintainers can use any path by own taste---we can't satisfy 326 variety of distributions/packages. 327 328 So you can: 329 - fix path in stlport administration config file stlport/stl/config/host.h, 330 see _STLP_NATIVE_INCLUDE_PATH macro and related. 331 - create a link to the native compiler headers like expected by STLport 332 - make request to package maintainer 333 - build and install compiler 334 335 Note: Starting with version 5.2, STLport uses the include_next preprocessing 336 command to access native headers so you shouldn't experiment this problem 337 anymore when this feature is supported by your compiler preprocessor. 338 339 ======================================================================== 340 341 Q3.1 Do I need to build a library to use STLport? 342 343 A3.1 You may omit usage (and, thus building) STLport library, but in this 344 case you can't use iostreams, locale, complex. 345 346 ======================================================================== 347 348 Q3.2 During library compilation with MS VC++ 6.0 I see following error report: 349 350 C:\Program Files\Microsoft SDK\Include\.\winbase.h(1123) : error C2733: second C linkage of overloaded function 'InterlockedIncrement' not allowed 351 C:\Program Files\Microsoft SDK\Include\.\winbase.h(1121) : see declaration of 'InterlockedIncrement' 352 C:\Program Files\Microsoft SDK\Include\.\winbase.h(1130) : error C2733: second C linkage of overloaded function 'InterlockedDecrement' not allowed 353 C:\Program Files\Microsoft SDK\Include\.\winbase.h(1128) : see declaration of 'InterlockedDecrement' 354 C:\Program Files\Microsoft SDK\Include\.\winbase.h(1138) : error C2733: second C linkage of overloaded function 'InterlockedExchange' not allowed 355 C:\Program Files\Microsoft SDK\Include\.\winbase.h(1135) : see declaration of 'InterlockedExchange' 356 357 A3.2 You have a Platform SDK installed. Uncomment line 358 #define _STLP_NEW_PLATFORM_SDK 1 359 in the file stlport/stl/config/user_config.h. There is no way to detect SDK 360 presence during preprocessor stage, which is why you have to make this 361 change manually. 362 363 ======================================================================== 364 365 Q3.3 Has anybody succeeded building STLport on OS S with compiler K n.n? 366 367 A3.3 See report about results of regression tests here: build/test/unit/STATUS. 368 369 ======================================================================== 370 371 Q3.4 Does STLport support cross-compilation? 372 373 A3.4 In case of GCC, use something like following sequence: 374 375 (./configure --target=${CROSSTARGET}; cd build/lib; \ 376 export PATH=${BASECROSS}/bin:${PATH}; make -f gcc.mak install-release-shared) 377 378 where CROSSTARGET is GCC's cross prefix (something like 'i586-pc-linux-gnu', 379 if C++ cross compiler named as 'i586-pc-linux-gnu-c++'), BASECROSS is base of 380 cross-compiler's location (i.e. ${BASECROSS}/bin in case above is a location 381 of 'i586-pc-linux-gnu-c++'). 382 383 In case of non-GCC crossecompilers, we need hands-made target system identification. 384 The sample of such compiler (supported by STLport) is MetroWerks Codewarrior 385 for Novell Netware (mwccnlm). 386 387 ======================================================================== 388 389 Q4.1 I tried "make -f gcc.mak install", but it installs nothing into 390 /usr/local/. How I can install headers into /usr/local/include and 391 libs into /usr/local/lib? 392 393 A4.1 Installation in any system-wide place is issue of either 'package builder' 394 or system administrator. He/she should be familiar with building package 395 procedure and/or understand where headers and libraries should be situated. 396 The place choice not issue of STLport. 397 398 You can just use 399 400 (cd ${STLPORT_SRC}/lib; tar cf - . ) | (cd ${TARGET_LIB_DIR}; tar xf - ); \ 401 (cd ${STLPORT_SRC}; tar cf - stlport) | (cd ${TARGET_INCLUDE_DIR}; tar xf - ) 402 403 Sometimes we will think about 'make install', but not now. 404 405 406 ======================================================================== 407 408 Q5.0 I found a bug, how I can report about it? 409 410 A5.0 411 0. Ensure that this is really a bug (standard violation, incorrect 412 behaviour with correct usage). 413 1. Ensure that bug is in STLport, not in your code (you can use _STLP_DEBUG 414 for that, see stlport/stl/config/user_config.h). 415 2. Ensure that you correctly built STLport---build and run unit tests 416 (build/test/unit) first with default settings, then with your settings 417 (if you changed any). 418 3. Write a short test that demonstrates the bug. 419 4. Make sure that this test case is really new, i.e. not covered by unit 420 tests (test/unit/*). 421 5. Compare your results with reported runs of unit tests (build/test/unit/STATUS). 422 6. Write bug description and test here 423 424 https://sourceforge.net/projects/stlport 425 426 DON'T FORGET TO DESCRIBE: 427 428 - OPERATIONAL ENVIRONMENT 429 - COMPILER VERSION 430 - STLPORT VERSION 431 - RESULT OF UNIT TESTS 432 433 Keep in mind, that your bug MUST be reproduced by other people, so give 434 enough information (but compactly, give only essential information). 435 436 ======================================================================== 437 438 Q6.0 In STLport files like locale.h, setjmp.h, stdlib.h, etc., do 439 nothing except include native headers. Why are these files present in STLport? 440 441 A6.0 Sometimes native C headers are using C++ ones or are refering 442 to the std namespace. That's why, if stddef was absent in STLport, then 443 444 #include <string> 445 #include <stddef.h> 446 447 may cause problem in following code, because std redefined in the end of 448 <string> header, and std may be used in stddef.h: 449 450 __BEGIN_NAMESPACE_STD 451 .... 452 __END_NAMESPACE_STD 453 454 where __BEGIN_NAMESPACE_STD is defined as 'namespace std {'. 455 To avoid this, STLport has stddef.h header and provide correct masquerade 456 for std. 457 458 ======================================================================== 459 460 Q6.1 Is STLport a replacement for headers and libraries that shipout 461 with compiler? 462 463 A6.1 In general no. In any case C++ language support from compiler is required 464 for STLport (operators new, delete, RTTI, exceptions support). STLport also 465 uses 'native' headers and libraries to take interface to system functions and 466 variables. 467 468 ======================================================================== 469 470 Q6.2 My tool detects memory leaks in application with STLport. Is this leak 471 from STLport? 472 473 A6.2 In most cases these are 'pseudo memory leaks' that some tools 474 wrongly detect. 475 476 In the default compile of STLport, the node allocator is used to allocate 477 internal memory. The node allocator works by pre-allocating a large chunk of 478 memory and handing out small memory blocks. The memory chunk is not freed 479 during running an application that uses STLport (i.e. it is not returned to 480 the system, but reused inside application). 481 See also http://www.sgi.com/tech/stl/alloc.html 482 483 There are tools like BoundsChecker, Purify or Valgrind that check for memory 484 leaks, for memory that isn't freed when no longer used. These tools may report 485 false memory leaks when one uses STLport's node allocator. The memory chunk is 486 normally freed at application end, but the memory checkers usually report memory 487 leaks before that point. Another memory problem might be reported when you use 488 shared libraries (e.g. DLL, this problem specific for Windows DLL model) that 489 uses STLport internally and are statically link to it. If memory is allocated in 490 a dll and released in an other then the STLport node allocator will keep the 491 released memory for a future use. If you do not use this memory then your 492 application global memory consumption will grow until the app crash even if there 493 is no real memory leak. This is why you should always use a coherent configuration 494 everything in dll or everything in static lib. 495 496 There are ways to remove the pseudo memory leaks (since the memory is properly 497 freed at the end of the program, the leaks are just pseudo-ones). You could use 498 another allocator that is used in STLport. Open the file 499 "./stlport/stl/config/host.h" and uncomment either one of the following: 500 501 502 _STLP_USE_NEWALLOC enables a simple allocator that uses "new/delete" 503 _STLP_USE_MALLOC enables a simple allocator that uses "malloc/free" 504 505 The new/delete allocator has the advantage of giving an entry point to track 506 memory starvation, see set_new_handler in your compiler doc or the C++ Standard 507 for more information. 508 509 Alternatively you can define the following symbol, just uncomment it in 510 "./stlport/stl/config/host.h". 511 512 _STLP_LEAKS_PEDANTIC 513 514 The symbol forces freeing all memory chunks. Also see the comments around the 515 symbol in the config file. 516 517 Note that you have to recompile STLport AND your application and all of your 518 dependent libraries if you make any change to the file! 519 520 There are also some defines that help in debugging memory problems in STLport. 521 In _STLP_DEBUG mode, just also define the following symbols, either in 522 "./stlport/stl/config/user_config.h" or in your project settings: 523 524 _STLP_DEBUG_ALLOC 525 _STLP_DEBUG_UNINITIALIZED 526 527 You don't need to rebuild STLport for these options, but you have to rebuild 528 your application and all of your dependent libraries if you make any change to 529 the file. 530 531 ======================================================================== 532 533 Q6.3 When running unit tests, I have errors in LocaleTest test fixture, how bad 534 is it? 535 536 A6.3 Failures in LocaleTest tests do not mean that your platform/compiler is not 537 fully supported by STLport. Platform independant localization tests are very hard 538 to write as Standard localization API has not been design to make unit test easy. 539 In STLport unit tests suite we have hard coded some expected values. Those values 540 depends on your OS configuration explaining why sometimes the tests are failing. 541 542 ======================================================================== 543 544 Q6.4 set or multiset iterators are immutable like const_iterators, why ? 545 546 A6.4 With set or multiset associative containers or even newly introduced 547 tr1::unordered_set and tr1::unordered_multiset key is confuse with data. It 548 means that modifying the data is also modifying the key. Modifying the key 549 might corrupt the container internal data structure so STLport prefer to 550 make this problem obvious and only return a const access to the key with 551 immutable iterators. Your solutions are: 552 - prefer map/multimap and split the key and the data 553 - use const_cast when you want to change a set/multiset element. 554 555