53

我有以下用于 C++ 开发的设置:

  • OS X Yosemite
  • CLion 140.2310.6(JetBrains 的跨平台 C/C++-IDECMake用作构建系统)
  • boost通过安装brew 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:致命错误:找不到“boost”文件

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_libraryand target_link_libraries,但都没有成功构建项目。

有人可以指出正确的方向如何确保我可以将boosts 功能包含到我的 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 EAP.app/Contents/bin/cmake/share/cmake-3.1/Modules/FindBoost.cmake:685(文件)处的CMake错误:

无法读取文件 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 ")

4

3 回答 3

70

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

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

毕竟,简短的语句序列应该足以成功(并且独立于平台)包含boostCMake项目中:

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()
于 2015-02-27T14:05:20.047 回答
18

尝试使用 CMake find_package(Boost)

源代码:http ://www.cmake.org/cmake/help/v3.0/module/FindBoost.html

它工作得更好,CMake 是为交叉编译而设计的,在 CMake 项目中给出绝对路径并不好。

编辑:

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

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

带有 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()
于 2015-02-27T10:00:52.293 回答
0

我找不到使用 clion 的 find_package() 的 boost 库。所以我的解决方案是从以下站点下载到最新版本的 boost:

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

之后,将其解压缩并导航到该文件夹CMakeList.txt​​以包含 boost 库。

include_directories("/path_to_external_library")

就我而言,我使用 linux,所以我把它放在 /usr/share/ 下。

include_directories("/usr/share/boost_1_66_0")

于 2020-06-07T20:58:12.593 回答