How to include external library (boost) into CLion C++ project with CMake?
Asked Answered
B

3

54

I have the following setup for C++ development:

  • OS X Yosemite
  • CLion 140.2310.6 (a cross-plattform C/C++-IDE by JetBrains using CMake as build system)
  • installed boost via brew install boost into /usr/local/Cellar/boost/

Now, my goal is to setup a simple project and include the boost library. I defined just one test.cpp file that looks like this:

#include <iostream>
#include <boost>

using namespace std;

int test() {
    cout << "Hello, World!" << endl;
    return 0; 
}

My CMakeLists.txt file looks like this:

cmake_minimum_required(VERSION 2.8.4) 
project(MyProject)

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11") 

include_directories("/usr/local/Cellar/boost/1.57.0/include/boost")

set(SOURCE_FILES main.cpp ./test.cpp)
add_executable(MyProject ${SOURCE_FILES}) 

When I build the project, I get the following error:

/Users/nburk/Documents/uni/master/master_thesis/MyProject/test.cpp:2:10: fatal error: 'boost' file not found

make[3]: *** [CMakeFiles/MyProject.dir/test.cpp.o] Error 1 make[2]: *** [CMakeFiles/MyProject.dir/all] Error 2 make[1]: *** [CMakeFiles/MyProject.dir/rule] Error 2 make: *** [MyProject] Error 2

I played around with adjusting paths here and there and also using add_library and target_link_libraries, none of which made the project build successfully.

Can someone point into the right direction how to make sure I can include boosts functionality into my CLion C++ project?

Update: Thanks to @Waxo's answer I used the following code in my CMakeLists.txt file which:

set(Boost_INCLUDE_DIR /usr/local/Cellar/boost/1.57.0)
set(Boost_LIBRARY_DIR /usr/local/Cellar/boost/1.57.0/lib)
find_package(Boost COMPONENTS system filesystem REQUIRED)
include_directories(${Boost_INCLUDE_DIR})

I now got past the file not found-error, but instead I get the following:

CMake Error at /Applications/CLion EAP.app/Contents/bin/cmake/share/cmake-3.1/Modules/FindBoost.cmake:685 (file):

file STRINGS file "/usr/local/Cellar/boost/1.57.0/boost/version.hpp" cannot be read.

Call Stack (most recent call first): CMakeLists.txt:11 (find_package)

Any ideas what I am still missing? The referred line (685) in FindBoost.cmake is: file(STRINGS "${Boost_INCLUDE_DIR}/boost/version.hpp" _boost_VERSION_HPP_CONTENTS REGEX "#define BOOST_(LIB_)?VERSION ")

Bluegill answered 27/2, 2015 at 9:16 Comment(3)
Do not set the Boost variables manually. find_package should work out of the box. If it does not, you should pass Boost_DIR to the cmakecommand. Do not write system-specific paths in the CMakeLists.txt. The whole point of cmake is to be cross-platform. Platform specific configuration should be rarely required, and if it is the way to do that is to pass the configuration parameters via command line or via cmake-gui.Cotswolds
if I don't include it, I get back to the file not found-error... however, I am sure that I am missing something else and your advise seems to make sense to me! my main problem is that I fail to understand some of the basics of how how CMake actually works, so I guess I've got to sit down and do my homework since I cant seem to find a trivial solution...Bluegill
I noticed now that your boost installation is in a non-standard path (/usr/local/cellar). The proper way to notify cmake to look for boost in that directory is to invoke cmake with cmake -DBOOST_ROOT=/usr/local/Cellar/boost/1.57.0 ... Cotswolds
B
70

After spending the whole afternoon on the issue, I solved it myself. It was a rather stupid mistake and all the hints in @Waxo's answer were really helpful.

The reason why it wasn't working for me that I wrote #include <boost> within my test.cpp-file, which apparently is just wrong. Instead, you need to refer directly to the header files that you actually want to include, so you should rather write e.g. #include <boost/thread.hpp>.

After all, a short sequence of statements should be enough to successfully (and platform-independently) include boost into a CMake project:

find_package(Boost 1.57.0 COMPONENTS system filesystem REQUIRED)
include_directories(${Boost_INCLUDE_DIRS})
add_executable(BoostTest main.cpp)
target_link_libraries(BoostTest ${Boost_LIBRARIES})

These lines are doing the magic here. For reference, here is a complete CMakeLists.txt file that I used for debugging in a separate command line project:

cmake_minimum_required(VERSION 2.8.4)

project(BoostTest)

message(STATUS "start running cmake...")

find_package(Boost 1.57.0 COMPONENTS system filesystem REQUIRED)

if(Boost_FOUND)

    message(STATUS "Boost_INCLUDE_DIRS: ${Boost_INCLUDE_DIRS}")
    message(STATUS "Boost_LIBRARIES: ${Boost_LIBRARIES}")
    message(STATUS "Boost_VERSION: ${Boost_VERSION}")

    include_directories(${Boost_INCLUDE_DIRS})

endif()

add_executable(BoostTest main.cpp)

if(Boost_FOUND)

    target_link_libraries(BoostTest ${Boost_LIBRARIES})

endif()
Bluegill answered 27/2, 2015 at 14:5 Comment(3)
Amazing answer, thanks! For OS X users: this will also work when you've installed Boost using Homebrew.Hound
I've installed boost with MacPorts and it seems that CLion (version 1.2.4) managed to find it automatically (without any changes in CMakeLists.txt).Petuntse
Is it the same in Window??Boorer
W
18

Try using CMake find_package(Boost)

src : http://www.cmake.org/cmake/help/v3.0/module/FindBoost.html

It works better and CMake is made for cross compilation and giving an absolute path is not good in a CMake project.

Edit:

Look at this one too : How to link C++ program with Boost using CMake

Because you don't link actually the boost library to your executable.

CMake with boost usually looks like that :

set(Boost_USE_STATIC_LIBS        ON) # only find static libs
set(Boost_USE_MULTITHREADED      ON)
set(Boost_USE_STATIC_RUNTIME    OFF)
find_package(Boost 1.57.0 COMPONENTS date_time filesystem system ...)
if(Boost_FOUND)
  include_directories(${Boost_INCLUDE_DIRS})
  add_executable(foo foo.cc)
  target_link_libraries(foo ${Boost_LIBRARIES})
endif()
Waggon answered 27/2, 2015 at 10:0 Comment(3)
I stumbled upon this question too and it actually worked so that I didn't get the file not found-error anymore... however, I now get a new error: file STRINGS file /usr/local/Cellar/boost/1.57.0/boost/version.hpp" cannot be read.... I updated my question, any ideas?Bluegill
Theorically you don't have to set Boost_INCLUDE_DIR and Boost_LIBRARY_DIR, it's the work of the find_package(Boost) line. And don't forget the linking line. If the error still persists maybe have a look at the rights on the file.Waggon
Thank you. It was a pleasure to help, i have hard times when i started CMake, good luckWaggon
T
0

I couldn't find boost library using find_package() of clion. So my solution is download to the latest version boost from the following site:

https://sourceforge.net/projects/boost/files/boost/

After that, extract it and navigate to that folder in CMakeList.txt to include boost library.

include_directories("/path_to_external_library")

In my case, I use linux and so I put it under /usr/share/.

include_directories("/usr/share/boost_1_66_0")

Truditrudie answered 7/6, 2020 at 20:58 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.