C++ Programming/Compiler/Linker/Libraries/Static and Dynamic Libraries

From Wikibooks, the open-content textbooks collection

Jump to: navigation, search

Contents

[edit] Static and Dynamic Libraries

Libraries come in two forms, either in source form or in compiled/binary form. Libraries in source-form must first be compiled before they can be included in another project. This will transform the libraries' cpp-files into a lib-file. If a program needs to be recompiled to run with a new version of library but doesn't require any further modifications, the library is source compatible. If a program does not need to be modified and recompiled in order to use a new version of a library, the library is binary compatible.

Advantages of using static binaries:

  • Simplification of program distribution (fewer files)
  • Code simplification (no version checks of dynamic libraries)

Disadvantages of using static binaries:

  • Waste of resources: Generates larger binaries, since the library is compiled into every executable. Wasting memory, since library cannot be shared (in memory) between processes (may depend on operating system).
  • Program will not benefit from bug fixes or extensions in the libraries without being recompiled.
Binary/Source Compatibility of libraries

A library is said to be binary compatible if the program that dynamically links to a previous version of that library, continues to work using another versions of the same library. If a recompilation of the program is needed for it to operate with each new version the library is said to be source compatible.

Producing and maintaining binary compatible libraries is beneficial for distribution but harder to be maintained by teh library creators, it is often seen as a better solution to do static linking if the library is only source compatible since it will not cause problems to the end user.

Binary compatibility saves a lot of trouble and is a signal that the library reached a status of stability. It makes it much easier to distribute software for a certain platform. Without ensuring binary compatibility between releases, people will be forced to provide statically linked binaries.

[edit] Example: Configuring MS Visual C++ to use external libraries

The Boost library is used as example library.

NOTE:
Boost.org has a install guide named Getting Started on Windows, that points to an automatic installed provided by BoostPro Computing (commonly supporting the previous and older release versions), noting also that if used with the option “Source and Documentation” deselected (selected by default), it will not show the libs/ subdirectory. This will disable the user from rebuilding part of the libraries that aren't only header files. This makes installing it yourself as shown in this section the best option.

Considering you already have decompressed and have the binary part of the Boost library built. There the steps which have to be performed:

[edit] Include directory

Set up the include directory. This is the directory that contains the header files (.h/hpp), which describes the library interface:

include directories

[edit] Library directory

Set up the library directory. This is the directory that contains the pre-compiled library files (.lib):

library directories

[edit] Library files

Enter library filenames in additional dependencies for the libraries to use:

library filenames (the Boost "REGEXP"-library in this example)

Some libraries (such as e.g. Boost) uses auto-linking to automate the process of selecting library files for linking, based on which header-files are included. Manual selection of library filenames are not required for such libraries if your compiler supports auto-linking.

[edit] Dynamic libraries

In case of dynamically loaded (.dll) libraries, one also have to place the DLL-files either in the same folder as the executable, or in the system PATH.

[edit] Run-time library

The libraries also have to be compiled with the same run-time library as the one used in your project. Many libraries therefore come in different editions, depending on whether they are compiled for single- or multithreaded runtime and debug or release runtime, as well as whether they contain debug symbols or not.

selection of run-time library