
==================================================
STLport README for Microsoft Visual C++ compilers.
==================================================

by: Francois Dumont, dums@stlport.com, last edited 08/02/2005

============
Introduction
============
This document describes how STLport can be compiled and used with Microsoft
Visual C++ 6 SP5. It can also be used for the MSVC++ family.

For any further comments or questsion visit STLport mailing lists
http://stlport.sourceforge.net/Maillists.shtml or forums
https://sourceforge.net/forum/?group_id=146814

=============
Prerequisites
=============
To build and use STLport you will need following tools and libraries:
 - Microsoft Visual C++ 6.0 with at least Service Pack 5 or any higher
 version.

===================
Configuring STLport
===================
In a console window go to the STLport build/lib folder. Run

	configure --help

This command will present you the different available build options. Just follow
the instructions to set STLport configuration according your needs. The only
mandatory configuration is to declare what is the compiler you are going to
use, for MSVC 6 it is:

	configure -c msvc6

================
Building STLport
================
This is a step by step description of the actions to take in order to have
the STLport library built:

1. Open a console window. You can get it executing cmd or command depending
on your Windows OS.

2. Go to MSVC++ Bin directory with a default MSVC6 install it is
	cd "C:\Program Files\Microsoft Visual Studio\VC98\Bin"

3. Run the vcvars32.bat script. This sets the environment variables required
to have the MSVC++ compiler run during the build process. The most important
one is the PATH variable so that you can call the cl.exe command which is the
MSVC++ command line compiler. [You may omit this step, if you chose 'Install paths
to access command-line tools' during Microsoft Visual Studio installation procedure.]

4. Go to the STLport build/lib folder:
	cd C:\STLport\build\lib

5. Run the following command:
	nmake /fmsvc.mak install

	nmake is the make utility from Microsoft. /f is an nmake option
telling it which make file script to use. You have of course to grant the 
closer make file to your effective compiler, msvc.mak in our case.

	Once the command returns, you will have all the necessary libraries within
the STLport lib folder. For a description of the generated libraries check the README
file within the src folder.

===============
Testing STLport
===============
You can use the unit tests to verify STLport behaves correctly. Change into
STLports 'build/test/unit' folder and type:

  nmake /fmsvc.mak install

Once the unit test is built you just need to run it. They can be found
within the STLport bin folder.

=============
Using STLport
=============
Adjust your include and link paths in MSVC IDE (in 'Tools -> Options -> Directories'
for MSVC6 IDE). In the include files add the path to STLport's 'stlport' folder. 
Make sure it is the first directory listed there. Add STLport's 'lib' folder for
the library files (order of paths doesn't matter here).

There are some preprocessor defines that control usage of the STLport in msvc
projects:

If you don't want to use the iostreams part of the library, you can specify the
define _STLP_NO_IOSTREAMS. In this mode there is no need to link against the
library.

STLport uses automatic linking to find the proper .lib file. If you want to see
what import library STLport is going to use, define _STLP_VERBOSE_AUTO_LINK.
When not using automatic linking (by specifying _STLP_DONT_USE_AUTO_LINK), you
have to specify the proper .lib file in the Project Settings, on the "link" tab.
The .lib names have the following syntax:

   stlport(d|stld)[_static].<STLport-Version>.lib

Examples:

   stlport_static.5.0.lib - static release version, Version 5.0.0
   stlportd_50.lib - dll debug version, Version 5.0.0

When using STLport together with MFC, be sure to include the MFC headers first,
then include STLport headers, e.g. in your Stdafx.h. This way STLport correctly
recognizes MFC usage. You also can define the macro _STLP_USE_MFC, either in
your project settings or in stlport/stl/config/user_config.h.

Now you should be ready to use STLport.

============
Known issues
============

1. InterlockedIncrement

	If you experiment trouble with the InterlockedIncrement Win32 API function
like the following message:

C:\Program Files\Microsoft SDK\Include\.\winbase.h(1392) : error C2733: second C
linkage of overloaded function 'InterlockedIncrement' not allowed
C:\Program Files\Microsoft SDK\Include\.\winbase.h(1390) : see declaration of
'InterlockedIncrement'

	It means that you are using the new Microsoft platform SDK. There is no
way to known it from STLport so you have to signal it in the 
stlport/stl/config/user_config.h file (uncomment _STLP_NEW_PLATFORM_SDK in this file).

2. Native C/C++ library headers location

	If you experiment trouble with location of ctime and other Standard headers
while building or using STLport you might be using the compiler coming with a
platform SDK. If so please uncomment _STLP_USING_PLATFORM_SDK_COMPILER in
stlport/stl/config/user_config.h. If it still do not find native headers you will
perhaps need to change native headers relative path used by STLport. In this case use
_STLP_NATIVE_INCLUDE_PATH and associated macro in stlport/stl/config/host.h.

4. C symbols in std namespace

The compiler of MSVC++ 6 has a bug when dealing with symbols existant in both
the global namespace and symbols imported by a using-directive or a 
using-declaration - it will report an ambiguous call to an overloaded
function (error C2668). Example:

void function();
namespace ns {
   void function();
   // or:
   // using ::function;
}

using ns::function;
// or:
// using namespace ns;

void call() {
   function();
}

Since we anticipate that using-declarations or even using-directives are common
use, STLport by default doesn't import or wrap functions that exist in both the
global namespace and namespace std, in particular those are functions with C 
origin like fopen() or abs(). Also, it defines additional overloads for
functions like abs() (overloaded for int, long, float, double, long double) in
the global namespace.

In order to make STLport include them in the std namespace, you can define the
_STLP_DO_IMPORT_CSTD_FUNCTIONS macro. Doing so, you will have to explicitely 
scope all your functions calls like std::abs() though - otherwise you only get
the global abs(int) from the C library.
