如何使用CMake将外部库(boost)包含到CLion C ++项目中?

时间:2015-02-27 09:16:38

标签: c++ boost cmake clion

我有以下C ++开发设置:

  • OS X Yosemite
  • CLion 140.2310.6(一个跨平台的C / C ++ - 由JetBrains使用CMake作为构建系统的IDE)
  • 通过boostbrew install boost安装到/usr/local/Cellar/boost/

现在,我的目标是设置一个简单的项目并包含boost库。我只定义了一个 test.cpp 文件,如下所示:

#include <iostream>
#include <boost>

using namespace std;

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

我的 CMakeLists.txt 文件如下所示:

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}) 

当我构建项目时,我收到以下错误:

  

/Users/nburk/Documents/uni/master/master_thesis/MyProject/test.cpp:2:10:   致命错误:找不到“提升”文件

     

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

我在这里和那里调整路径并使用add_librarytarget_link_libraries,这些都没有使项目成功构建。

有人能指出正确的方向如何确保我可以将boost功能包含在我的CLion C ++项目中吗?

更新 感谢@ Waxo的回答,我在 CMakeLists.txt 文件中使用了以下代码:

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})

我现在已经超过找不到文件 - 错误,但我得到以下内容:

  

/ Applications / CLion的CMake错误   EAP.app/Contents/bin/cmake/share/cmake-3.1/Modules/FindBoost.cmake:685   (档案):

     

文件STRINGS文件“/usr/local/Cellar/boost/1.57.0/boost/version.hpp”无法读取。

     

调用堆栈(最近一次调用):CMakeLists.txt:11   (find_package)

我还缺少什么想法? FindBoost.cmake 中的引用行(685)是: file(STRINGS "${Boost_INCLUDE_DIR}/boost/version.hpp" _boost_VERSION_HPP_CONTENTS REGEX "#define BOOST_(LIB_)?VERSION ")

3 个答案:

答案 0 :(得分:62)

在整个下午花了这个问题后,我自己解决了。这是一个相当愚蠢的错误,@ Waxo的答案中的所有提示都非常有用。

我在 test.cpp -file中编写#include <boost>的原因并不适合我,这显然是错误的。相反,您需要直接引用您实际想要包含的头文件,因此您应该写例如: #include <boost/thread.hpp>

毕竟,短序列语句应该足以成功(并且平台独立)将boost包含到CMake项目中:

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})

这些线路正在这里发挥作用。作为参考,这是一个完整的 CMakeLists.txt 文件,我在一个单独的命令行项目中用于调试:

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()

答案 1 :(得分:16)

尝试使用CMake find_package(Boost)

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

它更好用,CMake用于交叉编译,并且在CMake项目中给出绝对路径并不好。

修改:

也请看这个:How to link C++ program with Boost using CMake

因为您实际上没有将boost库链接到您的可执行文件。

使用提升的CMake通常看起来像这样:

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()

答案 2 :(得分:0)

我无法使用clion的find_package()找到增强库。因此,我的解决方案是从以下站点下载到最新版本的Boost:

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

然后,将其解压缩并导航到CMakeList.txt中的该文件夹以包含增强库。

include_directories("/path_to_external_library")

就我而言,我使用linux,因此将其放在/ usr / share /下。

include_directories("/usr/share/boost_1_66_0")