123

I'm trying to configure a project using CMake, but it fails to find Boost libraries even though they are in the specified folder. I have specified Boost_INCLUDE_DIR, Boost_LIBRARYDIR and BOOST_ROOT , but I still get an error saying that CMake is not able to find Boost. What could be the reason of such error?

Kevin
  • 16,549
  • 8
  • 60
  • 74
Ivan Gromov
  • 4,195
  • 9
  • 41
  • 57
  • 1
    Some versions of Boost use the flag `Boost_INCLUDE_DIR` and others use the flag `Boost_INCLUDEDIR` (**without the underscore**). You can check the right one for your case by reading the `FindBoost.cmake` file, under `path-to-cmake/Modules/FindBoost.cmake` – marcelosalloum Jul 05 '19 at 14:03
  • FYI, if you are building boost with CMake support you should use `find_package(Boost CONFIG)` – Dmitry Sazonov Oct 04 '19 at 16:47

16 Answers16

130

Are you sure you are doing it the correct way? The idea is that CMake sets BOOST_INCLUDE_DIR, BOOST_LIBRARYDIR and BOOST_ROOT automatically. Do something like this in CMakeLists.txt:

FIND_PACKAGE(Boost)
IF (Boost_FOUND)
    INCLUDE_DIRECTORIES(${Boost_INCLUDE_DIR})
    ADD_DEFINITIONS( "-DHAS_BOOST" )
ENDIF()

If boost is not installed in a default location and can, thus, not be found by CMake, you can tell CMake where to look for boost like this:

SET(CMAKE_INCLUDE_PATH ${CMAKE_INCLUDE_PATH} "C:/win32libs/boost")
SET(CMAKE_LIBRARY_PATH ${CMAKE_LIBRARY_PATH} "C:/win32libs/boost/lib")

Of course, those two lines have to be before the FIND_PACKAGE(Boost) in CMakeLists.txt.

Kevin
  • 16,549
  • 8
  • 60
  • 74
fschmitt
  • 3,478
  • 2
  • 22
  • 24
  • 42
    It is `${Boost_INCLUDE_DIR}` not `${BOOST_INCLUDE_DIR}`, case matters. – Ihor Kaharlichenko Nov 25 '11 at 14:04
  • 3
    Maybe this has changed in newer versions of cmake, but here's the reference docs: http://www.cmake.org/cmake/help/v3.0/module/FindBoost.html – Nick Desaulniers Mar 31 '15 at 01:44
  • 2
    it doesnt work for me... It finds the boost library, but generate tons of errors at compilation time –  Jan 08 '16 at 07:32
  • 1
    Shouldn't it be '`BOOST_INCLUDEDIR`'? – dmedine Jan 22 '18 at 13:30
  • 3
    @IhorKaharlichenko, but BOOST_ROOT should be BOOST_ROOT. wonderful ! Let me try with all cases, camel case, all caps, with underscores, without underscores ... – Duck Dodgers May 18 '18 at 12:15
  • 1
    @JoeyMallone, not that I came up with this wonderful and consistent approach. Address your complaints upstream :) – Ihor Kaharlichenko May 22 '18 at 07:24
  • What if Boost is not installed in a default location and you don't want to have to edit your CMakeLists.txt file as a result of that? CMakeLists.txt files shouldn't be personal, and adding a path on your computer to your CMakeLists.txt file makes it personal. – HelloGoodbye Mar 12 '19 at 15:21
  • 1
    @dmedine I have never seen `BOOST_INCLUDEDIR`, but I have seen `BOOST_INCLUDE_DIR` several times. – HelloGoodbye Mar 12 '19 at 15:23
  • Some versions of Boost use the flag `Boost_INCLUDE_DIR` and others use the flag `Boost_INCLUDEDIR` (**without the underscore**). You can check the right one for your case by reading the `FindBoost.cmake` file, under `path-to-cmake/Modules/FindBoost.cmake` – marcelosalloum Jul 05 '19 at 14:03
  • for version 1.77 and for the library path I used the boost_1_77_0/stage/lib and not boost/lib. (could be useful for someone) – leo_bouts Nov 02 '21 at 10:04
58

There is more help available by reading the FindBoost.cmake file itself. It is located in your 'Modules' directory.

A good start is to set(Boost_DEBUG 1) - this will spit out a good deal of information about where boost is looking, what it's looking for, and may help explain why it can't find it.

It can also help you to figure out if it is picking up on your BOOST_ROOT properly.

FindBoost.cmake also sometimes has problems if the exact version of boost is not listed in the Available Versions variables. You can find more about this by reading FindBoost.cmake.

Lastly, FindBoost.cmake has had some bugs in the past. One thing you might try is to take a newer version of FindBoost.cmake out of the latest version of CMake, and stick it into your project folder alongside CMakeLists.txt - then even if you have an old version of boost, it will use the new version of FindBoost.cmake that is in your project's folder.

Good luck.

Kevin
  • 16,549
  • 8
  • 60
  • 74
don bright
  • 1,113
  • 1
  • 11
  • 15
28

For me this error was simply because boost wasn't installed so on ubuntu:

sudo apt install build-essential libboost-system-dev libboost-thread-dev libboost-program-options-dev libboost-test-dev

bbs
  • 1,874
  • 1
  • 17
  • 17
12

I struggled with this problem for a while myself. It turned out that cmake was looking for Boost library files using Boost's naming convention, in which the library name is a function of the compiler version used to build it. Our Boost libraries were built using GCC 4.9.1, and that compiler version was in fact present on our system; however, GCC 4.4.7 also happened to be installed. As it happens, cmake's FindBoost.cmake script was auto-detecting the GCC 4.4.7 installation instead of the GCC 4.9.1 one, and thus was looking for Boost library files with "gcc44" in the file names, rather than "gcc49".

The simple fix was to force cmake to assume that GCC 4.9 was present, by setting Boost_COMPILER to "-gcc49" in CMakeLists.txt. With this change, FindBoost.cmake looked for, and found, my Boost library files.

huzeyfe
  • 3,554
  • 6
  • 39
  • 49
Tom P.
  • 121
  • 1
  • 5
9

You can also specify the version of Boost that you would like CMake to use by passing -DBOOST_INCLUDEDIR or -DBOOST_ROOT pointing to the location of correct version boost headers

Example:

cmake -DBOOST_ROOT=/opt/latestboost

This will also be useful when multiple boost versions are on the same system.

Kevin
  • 16,549
  • 8
  • 60
  • 74
Skillachie
  • 3,176
  • 1
  • 25
  • 26
  • Thanks, that worked for me with Avro build for Windows. – ggurov Jul 09 '18 at 15:21
  • Worked for me, setting it in the CMake GUI tool as a Environment... Then Add Entry, then BOOST_ROOT, value C:\Program Files\PCL 1.11.1\3rdParty\Boost (I have PCL Installed) – Richard Keene Nov 14 '20 at 20:55
8

I also had a similar problem and discovered that the BOOST_INCLUDE_DIR, BOOST_LIBRARYDIR and BOOST_ROOT env variables must hold absolute paths. HTH!

sphakka
  • 457
  • 4
  • 11
  • 1
    Yes. Had the same problem because of the relative path in the BOOST_ROOT env. Many thanks to you! – korst1k Aug 17 '20 at 13:22
4

In my case Boost was not installed. I used below command on Mac and then cmake find_package(Boost) works like a charm

brew install Boost

Please note upper case 'B' in Boost!

Digital_Reality
  • 4,488
  • 1
  • 29
  • 31
3

If you are building your own boost do not forget to use the --layout=versioned otherwise the search for a particular version of library will fail

Lumos
  • 570
  • 1
  • 11
  • 24
Gaetano Mendola
  • 1,344
  • 3
  • 12
  • 27
2

For cmake version 3.1.0-rc2 to pick up boost 1.57 specify -D_boost_TEST_VERSIONS=1.57

cmake version 3.1.0-rc2 defaults to boost<=1.56.0 as is seen using -DBoost_DEBUG=ON

cmake -D_boost_TEST_VERSIONS=1.57 -DBoost_DEBUG=ON -DCMAKE_BUILD_TYPE=Debug -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++

Lumos
  • 570
  • 1
  • 11
  • 24
Simon Allfrey
  • 51
  • 1
  • 6
1

One more bit of advice for anyone trying to build CGAL in particular, with statically linked Boost. It is not enough to define Boost_USE_STATIC_LIBS; it gets overridden by the time Boost_DEBUG outputs its value. The thing to do here is to check the "Advanced" checkbox and to enable CGAL_Boost_USE_STATIC_LIBS.

Philip
  • 1,532
  • 12
  • 23
1

I had the same problem while trying to run make for a project after installing Boost version 1.66.0 on Ubuntu Trusty64. The error message was similar to (not exactly like) this one:

CMake Error at     
/usr/local/Cellar/cmake/3.3.2/share/cmake/Modules/FindBoost.cmake:1245 (message):
Unable to find the requested Boost libraries.
Boost version: 0.0.0
Boost include path: /usr/include
Detected version of Boost is too old.  Requested version was 1.36 (or newer).
Call Stack (most recent call first):
CMakeLists.txt:10 (FIND_PACKAGE)

Boost was definitely installed, but CMake couldn't detect it. After spending plenty of time tinkering with paths and environmental variables, I eventually ended up checking cmake itself for options and found the following:

--check-system-vars        = Find problems with variable usage in system files

So I ran the following in the directory at issue:

sudo cmake --check-system-vars

which returned:

Also check system files when warning about unused and uninitialized variables.
-- Boost version: 1.66.0
-- Found the following Boost libraries:
--   system
--   filesystem
--   thread
--   date_time
--   chrono
--   regex
--   serialization
--   program_options
-- Found Git: /usr/bin/git
-- Configuring done
-- Generating done
-- Build files have been written to: /home/user/myproject

and resolved the issue.

user3006381
  • 2,735
  • 3
  • 23
  • 32
1

See FindBoost.cmake first. The variables you set are the correct ones but they should be all uppercase.

Make sure the library architecture matches with CMake configuration.

cmake -A x64 ..

I suggest creating a minimal executable which only includes a Boost library to see if it compiles.

#include <iostream>
#include <boost/date_time.hpp>
int main() {
    using namespace std;
    using namespace boost::gregorian;
    date today = day_clock::local_day();
    cout << today << endl;
}
find_package(Boost REQUIRED COMPONENTS
  date_time
)

include_directories(${Boost_INCLUDE_DIR})
link_directories(${Boost_LIBRARY_DIRS})

add_executable(test_boost "test_boost.cpp")
target_link_libraries(test_boost Boost::date_time)

Start debugging by checking Boost_FOUND first.

message(STATUS "Boost_FOUND: ${Boost_FOUND}")

The version should be found even if no libraries are found. (Boost_VERSION)

If Boost_LIBRARY_DIRS becomes non-empty, it should compile.

Burak
  • 2,251
  • 1
  • 16
  • 33
0

I had the same problem, and none of the above solutions worked. Actually, the file include/boost/version.hpp could not be read (by the cmake script launched by jenkins).

I had to manually change the permission of the (boost) library (even though jenkins belongs to the group, but that is another problem linked to jenkins that I could not figure out):

chmod o+wx ${BOOST_ROOT} -R # allow reading/execution on the whole library
#chmod g+wx ${BOOST_ROOT} -R # this did not suffice, strangely, but it is another story I guess
PJ127
  • 986
  • 13
  • 23
0

This can also happen if CMAKE_FIND_ROOT_PATH is set as different from BOOST_ROOT. I faced the same issue that in spite of setting BOOST_ROOT, I was getting the error. But for cross compiling for ARM I was using Toolchain-android.cmake in which I had (for some reason):

set(BOOST_ROOT "/home/.../boost")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} --sysroot=${SYSROOT}")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} --sysroot=${SYSROOT} -I${SYSROOT}/include/libcxx")
set(CMAKE_CXX_LINK_FLAGS "${CMAKE_CXX_LINK_FLAGS}")
set(CMAKE_FIND_ROOT_PATH "${SYSROOT}")

CMAKE_FIND_ROOT_PATH seems to be overriding BOOST_ROOT which was causing the issue.

David Buck
  • 3,752
  • 35
  • 31
  • 35
Sabin
  • 61
  • 3
0

For those using python3.7 docker image, this solved:

apt install libboost-system-dev libboost-thread-dev

Walucas
  • 2,549
  • 1
  • 21
  • 44
-1

Maybe

brew install boost

will help you.

Peyman Mohamadpour
  • 17,954
  • 24
  • 89
  • 100
yayu
  • 1