【问题标题】:How to include external library (boost) into CLion C++ project with CMake?如何使用 CMake 将外部库(增强)包含到 CLion C++ 项目中?
【发布时间】:2015-04-29 22:39:15
【问题描述】:

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

  • OS X Yosemite
  • CLion 140.2310.6(JetBrains 使用 CMake 作为构建系统的跨平台 C/C++-IDE)
  • 通过brew install boost 安装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,但都没有成功构建项目。

有人能指出正确的方向吗?如何确保我可以将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})

我现在解决了 file not found-错误,但我得到了以下信息:

/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 ")

【问题讨论】:

  • 不要手动设置Boost 变量。 find_package 应该开箱即用。如果没有,您应该将Boost_DIR 传递给cmake 命令。不要在 CMakeLists.txt 中写入系统特定的路径。 cmake 的重点是跨平台。很少需要特定于平台的配置,如果是这样的话,可以通过命令行或通过 cmake-gui 传递配置参数。
  • 如果我不包含它,我会返回 file not found-错误...但是,我确信我错过了其他内容和您的建议对我来说似乎很有意义!我的主要问题是我无法理解 CMake 实际工作原理的一些基础知识,所以我想我必须坐下来做功课,因为我似乎找不到简单的解决方案......
  • 我现在注意到您的 boost 安装在非标准路径中 (/usr/local/cellar)。 The proper way 通知 cmake 在该目录中查找 boost 是用 cmake -DBOOST_ROOT=/usr/local/Cellar/boost/1.57.0 ... 调用 cmake

标签: c++ boost cmake clion


【解决方案1】:

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

我在 test.cpp 文件中写了#include &lt;boost&gt; 对我不起作用的原因,这显然是错误的。相反,您需要直接引用您实际想要包含的头文件,因此您应该编写例如#include &lt;boost/thread.hpp&gt;.

毕竟,简短的语句序列应该足以成功(且独立于平台)将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()

【讨论】:

  • 惊人的答案,谢谢!对于 OS X 用户:当您使用 Homebrew 安装 Boost 时,这也可以工作。
  • 我已经用 MacPorts 安装了boost,似乎 CLion (version 1.2.4) 设法自动找到它(CMakeLists.txt 没有任何更改)。
  • 在Window里也一样吗??
【解决方案2】:

尝试使用 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()

【讨论】:

  • 我也偶然发现了这个问题,它确实有效,因此我不再收到 file not found-错误...但是,我现在收到一个新错误:file STRINGS file /usr/local/Cellar/boost/1.57.0/boost/version.hpp" cannot be read....我更新了我的问题,有什么想法吗?
  • 理论上你不必设置 Boost_INCLUDE_DIR 和 Boost_LIBRARY_DIR,这是 find_package(Boost) 行的工作。并且不要忘记连接线。如果错误仍然存​​在,请查看文件的权限。
  • 谢谢。很高兴能提供帮助,我刚开始 CMake 时遇到了困难,祝你好运
【解决方案3】:

我找不到使用 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")

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多