
.. _shared_library:

********************
Shared Library (DLL)
********************

General Information
===================

Shared libraries are compiled code that can be accessed by other programs.  On windows, they are DLL files, on other platforms .os (linux) or .dylib (OSX)

There are a few things that need to be considered when determining what shared library you should build/use:

* Calling convention (`http://en.wikipedia.org/wiki/Calling_convention <wikipedia>`_: ``__stdcall`` or ``__cdecl`` - only a consideration on 32-bit windows
* Architecture: 32-bit or 64-bit
* Compiler: Visual Studio, Mingw, GCC, clang

Pre-Compiled Binaries
======================

Download the appropriate shared library for your architecture from from :sfdownloads:`shared_library`, or the development versions from the buildbot server at :bbbinaries:`shared_library`.

User-Compiled Binaries
======================

Common Requirements
-------------------
Compilation of a shared library requires a few :ref:`common wrapper pre-requisites <wrapper_common_prereqs>`

Windows
-------
On windows, the greatest amount of complexity is experienced.  

Your compiler options are:

* MinGW (a windows port of GCC)
* Visual Studio, multiple versions can be installed in parallel

By default, cmake will use your most up to date version of visual studio it finds.

Your calling convention options are:

* 32-bit __stdcall (``-DCOOLPROP_32BIT_STDCALL_SHARED_LIBRARY=ON``)
* 32-bit __cdecl (``-DCOOLPROP_32BIT_CDECL_SHARED_LIBRARY=ON``)
* 64-bit (``-DCOOLPROP_64BIT_SHARED_LIBRARY=ON``)

You can select the compiler in the call to cmake below.

1. Check out sources and go into the build directory::

    # Check out the sources for CoolProp
    git clone https://github.com/CoolProp/CoolProp --recursive
    # Move into the folder you just created
    cd CoolProp
    # Make a build folder
    mkdir build && cd build
    
2. Generate the build file.  Here is where it gets complicated.  

    A. If you use MinGW, these are your options:

    For 64-bit DLL::

        cmake .. -DCOOLPROP_64BIT_SHARED_LIBRARY=ON -G "MinGW Makefiles"
        
    For 32-bit __stdcall DLL::
    
        cmake .. -DCOOLPROP_32BIT_STDCALL_SHARED_LIBRARY=ON -G "MinGW Makefiles"
        
    For 32-bit __cdecl DLL::
    
        cmake .. -DCOOLPROP_32BIT_CDECL_SHARED_LIBRARY=ON -G "MinGW Makefiles"
        
    B. If you use Visual Studio, you will need to replace the visual studio version with the version that you are using.  Running the command ``cmake`` at the command prompt will tell you what generators are supported
    
    For 64-bit DLL (Watch out for the 64-bit flag with Win64)::

        cmake .. -DCOOLPROP_64BIT_SHARED_LIBRARY=ON -G "Visual Studio 10 2010 Win64"
        
    For 32-bit __stdcall DLL::
    
        cmake .. -DCOOLPROP_32BIT_STDCALL_SHARED_LIBRARY=ON -G "Visual Studio 10 2010"
        
    For 32-bit __cdecl DLL::
    
        cmake .. -DCOOLPROP_32BIT_CDECL_SHARED_LIBRARY=ON -G "Visual Studio 10 2010"
        
3. Do the build::

    cmake --build . --config Release
    
If you are using MinGW, you can leave off the ``--config Release``, the default build configuration is release

Linux & OSX
-----------

On linux and OSX there is no calling convention to worry about, only options are 32-bit and 64-bit compilation.  If you give one of the 32-bit flags, the calling convention will be ignored, so just do that.

For 32-bit compilation::

    # Check out the sources for CoolProp
    git clone https://github.com/CoolProp/CoolProp --recursive
    # Move into the folder you just created
    cd CoolProp
    # Make a build folder
    mkdir build && cd build
    # Generate builder
    cmake .. -DCOOLPROP_32BIT_STDCALL_SHARED_LIBRARY=ON
    # Build
    cmake --build .
    
For 64-bit compilation::

    # Check out the sources for CoolProp
    git clone https://github.com/CoolProp/CoolProp --recursive
    # Move into the folder you just created
    cd CoolProp
    # Make a build folder
    mkdir build && cd build
    # Generate builder
    cmake .. -DCOOLPROP_64BIT_SHARED_LIBRARY=ON
    # Build
    cmake --build .
