如何使用 CMake 将外部库(boost)包含到 CLion C++ 项目中?
How to include external library (boost) into CLion C++ project with CMake?
我有以下 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:
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
我到处调整路径,还使用 add_library
和 target_link_libraries
,其中 none 使项目构建成功。
有人可以指出正确的方向如何确保我可以将 boost
s 功能包含到我的 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})
我现在已经过了 找不到文件 错误,但我得到了以下信息:
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)
知道我还缺少什么吗? FindBoost.cmake中引用的行(685)是:
file(STRINGS "${Boost_INCLUDE_DIR}/boost/version.hpp" _boost_VERSION_HPP_CONTENTS REGEX "#define BOOST_(LIB_)?VERSION ")
尝试使用 CMake find_package(提升)
来源:http://www.cmake.org/cmake/help/v3.0/module/FindBoost.html
它工作得更好,CMake 是为交叉编译而制作的,在 CMake 项目中给出绝对路径并不好。
编辑:
也看看这个:How to link C++ program with Boost using CMake
因为您实际上 link 没有将 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()
这个问题折腾了一下午,自己解决了。这是一个相当愚蠢的错误,@Waxo 的回答中的所有提示都非常有帮助。
我在 test.cpp 文件中写 #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()
我无法使用 clion 的 find_package() 找到增强库。所以我的解决方案是从以下站点下载到最新版本 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")
我有以下 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: 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
我到处调整路径,还使用 add_library
和 target_link_libraries
,其中 none 使项目构建成功。
有人可以指出正确的方向如何确保我可以将 boost
s 功能包含到我的 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})
我现在已经过了 找不到文件 错误,但我得到了以下信息:
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)
知道我还缺少什么吗? FindBoost.cmake中引用的行(685)是:
file(STRINGS "${Boost_INCLUDE_DIR}/boost/version.hpp" _boost_VERSION_HPP_CONTENTS REGEX "#define BOOST_(LIB_)?VERSION ")
尝试使用 CMake find_package(提升)
来源:http://www.cmake.org/cmake/help/v3.0/module/FindBoost.html
它工作得更好,CMake 是为交叉编译而制作的,在 CMake 项目中给出绝对路径并不好。
编辑:
也看看这个:How to link C++ program with Boost using CMake
因为您实际上 link 没有将 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()
这个问题折腾了一下午,自己解决了。这是一个相当愚蠢的错误,@Waxo 的回答中的所有提示都非常有帮助。
我在 test.cpp 文件中写 #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()
我无法使用 clion 的 find_package() 找到增强库。所以我的解决方案是从以下站点下载到最新版本 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")