How to link C++ program with Boost using CMake
In CMake you could use find_package
to find libraries you need. There usually is a FindBoost.cmake
along with your CMake installation.
As far as I remember, it will be installed to /usr/share/cmake/Modules/
along with other find-scripts for common libraries. You could just check the documentation in that file for more information about how it works.
An example out of my head:
FIND_PACKAGE( Boost 1.40 COMPONENTS program_options REQUIRED )
INCLUDE_DIRECTORIES( ${Boost_INCLUDE_DIR} )
ADD_EXECUTABLE( anyExecutable myMain.cpp )
TARGET_LINK_LIBRARIES( anyExecutable LINK_PUBLIC ${Boost_LIBRARIES} )
I hope this code helps.
- Here's the official documentation about FindBoost.cmake.
- And the actual FindBoost.cmake (hosted on GitHub)
How to auto-link boost libraries with CMake
Boost docs:
Auto-Linking
Most Windows compilers and linkers have so-called “auto-linking support,” which eliminates the second challenge. Special code in Boost header files detects your compiler options and uses that information to encode the name of the correct library into your object files; the linker selects the library with that name from the directories you've told it to search.
The GCC toolchains (Cygwin and MinGW) are notable exceptions; GCC users should refer to the linking instructions for Unix variant OSes for the appropriate command-line options to use.
Note that the auto-linking feature has been known to fail on occasion (e.g. when your Boost libraries are installed using a non-standard setting). You can define BOOST_ALL_NO_LIB
to disable the feature on Windows.
You shouldn't be hard-coding Boost paths into your CMakeLists.txt, though. Better use the platform-independent find_package
:
set( Boost_USE_STATIC_LIBS OFF )
set( Boost_USE_MULTITHREADED ON )
set( Boost_USE_STATIC_RUNTIME OFF )
find_package( Boost 1.72.0 COMPONENTS thread fiber context )
if ( Boost_FOUND )
include_directories( ${Boost_INCLUDE_DIRS} )
link_libraries( learn_asio ${Boost_LIBRARIES} )
else()
message( FATAL_ERROR "Required Boost packages not found. Perhaps add -DBOOST_ROOT?" )
endif()
Linking boost to c++ with cmake : command line compilation
On compiling boost
, the darwin
toolset used gcc
and g++
as compilers. This linked boost
to /usr/local/gcc-7.3/lib/libstdc++.6.dylib
(@ThomasSablik's comments helped narrow down on the problem).
$ otool -L libboost_filesystem-xgcc73-x64-1_69.dylib
libboost_filesystem-xgcc73-x64-1_69.dylib:
libboost_filesystem-xgcc73-x64-1_69.dylib (compatibility version 0.0.0, current version 0.0.0)
libboost_system-xgcc73-x64-1_69.dylib (compatibility version 0.0.0, current version 0.0.0)
/usr/local/gcc-7.3/lib/libstdc++.6.dylib (compatibility version 7.0.0, current version 7.24.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1252.50.4)
/usr/local/gcc-7.3/lib/libgcc_s.1.dylib (compatibility version 1.0.0, current version 1.0.0)
To ensure that the same compilers are used for my project, now CMakeLists.txt
has been edited to:
# -- Building with C++11 support
set(CMAKE_C_COMPILER /usr/local/gcc-7.3/bin/gcc)
set(CMAKE_CXX_COMPILER /usr/local/gcc-7.3/bin/g++)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
set(CMAKE_INSTALL_PREFIX ${CMAKE_SOURCE_DIR}/binaries)
This resolved the issue.
Adding Boost to CMake project?
Following recipe should work
Download Boost binaries from official boost binaries location and install to say C:\Boost
Most times you do not need to build Boost on your own.
Your CMakeLists.txt should look like follows
cmake_minimum_required (VERSION 3.8)
project(boostAndCMake)
set(BOOST_ROOT "C:\Boost") # either set it here or from the command line
set(Boost_USE_STATIC_LIBS OFF)
set(Boost_USE_MULTITHREADED ON)
set(Boost_USE_STATIC_RUNTIME OFF)
find_package(Boost REQUIRED COMPONENTS system) # header only libraries must not be added here
add_executable(CMakeProject2 CMakeProject2.cpp CMakeProject2.h)
target_include_directories(CMakeProject2 PUBLIC ${Boost_INCLUDE_DIRS})
target_link_libraries(CMakeProject2 ${Boost_LIBRARIES})
Because we used REQUIRED
on the find_package
call, CMake will fail execution and skip the rest of the script if it cannot be found. So no need to check Boost_FOUND
. You need to check it, when you omit REQUIRED
.
Now from the command line call from the directory where your script resides:
cmake -H. -Bbuildit -G "Visual Studio 15 2017" -DBOOST_ROOT=C:\Boost
This creates a build directory named buildit in the current directory, further creates a solution for Visual Studio 2017 inside the build directory and provides the setting for the variable BOOST_ROOT
that is used in the find_package
call to identify the Boost directory on your computer. To see what options are available on the find_package(Boost ...)
call see FindBoost documentation in CMake.
Header Only Libraries
If your libraries are header only you need to omit them from the find_package(Boost ...)
call. To see which libraries are not header only see this post.
Using newer Boost versions
If your CMake installation cannot find the requested version, e.g. 1.69.0, but supports the naming scheme of the more recent Boost version you can use it with set(Boost_ADDITIONAL_VERSIONS "1.69.0" "1.69")
. Last change of the Boost naming scheme was from 1.65.1 to 1.66.
Related Topics
How to Initialize Base Class Member Variables in Derived Class Constructor
Difference Between String and Char[] Types in C++
Export All Symbols When Creating a Dll
Registering a Cpp Dll into Com After Installation Using Wix Msi Installer
Why No Default Move-Assignment/Move-Constructor
Create an Array When the Size Is a Variable Not a Constant
Defining Static Const Integer Members in Class Definition
How to Convert a Double into a String in C++
"Incomplete Type" in Class Which Has a Member of the Same Type of the Class Itself
Virtual Functions and Performance - C++
C++ Function Template Partial Specialization
C/C++: Switch For Non-Integers
Sin and Cos Give Unexpected Results For Well-Known Angles
Can Inner Classes Access Private Variables
Printing 1 to 1000 Without Loop or Conditionals