如何使用CMake链接C++程序和Boost
我的cmake文件应该看起来像在Ubuntu下将我的程序与boost库链接起来应该是什么样子?如何使用CMake链接C++程序和Boost
的故障运行make的过程中显示:
main.cpp:(.text+0x3b): undefined reference to `boost::program_options::options_description::m_default_line_length'
主要文件是非常简单的:
#include <boost/program_options/options_description.hpp>
#include <boost/program_options/option.hpp>
using namespace std;
#include <iostream>
namespace po = boost::program_options;
int main(int argc, char** argv) {
po::options_description desc("Allowed options");
desc.add_options()
("help", "produce help message")
;
return 0;
}
我已经成功地做到这一点,我已经只有线添加到我的cmake文件中:
target_link_libraries(
my_target_file
${Boost_PROGRAM_OPTIONS_LIBRARY}
)
在CMake中,您可以使用find_package
来查找您需要的库。 通常有一个FindBoost.cmake
以及您的CMake安装。
据我记得,它将被安装到/usr/share/cmake/Modules/
以及其他通用库的查找脚本。 您可以查看该文件中的文档以获取有关其工作原理的更多信息。
我不是在现在的工作,所以我可能只是提供了一个例子从我的头:
FIND_PACKAGE(Boost 1.40 COMPONENTS program_options REQUIRED)
INCLUDE_DIRECTORIES(${Boost_INCLUDE_DIR})
ADD_EXECUTABLE(anyExecutable myMain.cpp)
TARGET_LINK_LIBRARIES(anyExecutable LINK_PUBLIC ${Boost_LIBRARIES})
希望这个代码可以帮助。
- 这是官方documentation about FindBoost.cmake。
- 和实际FindBoost.cmake(托管在Github上)
哪个Boost库?其中许多是纯模板,不需要链接。
编辑现在实际上表明具体的例子告诉我们,你想升压方案选择(甚至更告诉我们,你是在Ubuntu),你需要做两件事情:
- 安装
libboost-program-options-dev
这样就可以防止其链接 - 告诉
cmake
反对libboost_program_options
我主要使用的Makefile所以这里链接是直接命令 - 线使用:
$ g++ boost_program_options_ex1.cpp -o bpo_ex1 -lboost_program_options
$ ./bpo_ex1
$ ./bpo_ex1 -h
$ ./bpo_ex1 --help
$ ./bpo_ex1 -help
$
看起来并没有做太多。
对于CMake,您需要将boost_program_options添加到库的列表中,IIRC通过CMakeLists.txt
中的SET(liblist boost_program_options)
完成。
您的CMake建议是错误的(请参阅接受的答案),您的命令行建议不是很有帮助,因为问题与CMake有关。 – Ela782 2014-05-06 09:29:47
以下是我的配置:
cmake_minimum_required(VERSION 2.8)
set(Boost_INCLUDE_DIR /usr/local/src/boost_1_46_1)
set(Boost_LIBRARY_DIR /usr/local/src/boost_1_46_1/stage/lib)
find_package(Boost COMPONENTS system filesystem REQUIRED)
include_directories(${Boost_INCLUDE_DIR})
link_directories(${Boost_LIBRARY_DIR})
add_executable(main main.cpp)
target_link_libraries(main ${Boost_LIBRARIES})
link_directories不是必需的,因为Boost_LIBRARIES将是完全限定的路径。 – RobertJMaynard 2014-06-09 20:37:07
适应@MOnsDaR答案进口现代的目标CMake的语法,这将是:
find_package(Boost 1.40 COMPONENTS program_options REQUIRED)
add_executable(anyExecutable myMain.cpp)
target_link_libraries(anyExecutable Boost::program_options)
请注意,不需要手动指定包含目录,因为它已经通过导入的tar进行了处理获得Boost::program_options
。
这个目标方法的缺点是如果你的Boost版本比你的CMake版本更新,这可能会失败。 'FindBoost.cmake'最初只在明确列出你的Boost版本时才构建它们。在某些时候,这应该会得到改善,但我仍然看到CMake 3.10.2和Boost 1.66(酿造的最新副本)出现故障。 – 2018-02-23 11:36:03
添加Kitwares Github回购的工作链接。还添加了关于FindBoost.cmake官方文档的链接 – MOnsDaR 2014-06-09 19:34:06
为什么要升级1.40?图书馆的基本功能何时停止改变? – jgyou 2015-12-22 21:56:18
因为为什么不呢?这只是一个例子......填充任何最适合你的地方 – MOnsDaR 2016-02-04 07:45:47