如何使用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}) 

希望这个代码可以帮助。

+1

添加Kitwares Github回购的工作链接。还添加了关于FindBoost.cmake官方文档的链接 – MOnsDaR 2014-06-09 19:34:06

+1

为什么要升级1.40?图书馆的基本功能何时停止改变? – jgyou 2015-12-22 21:56:18

+4

因为为什么不呢?这只是一个例子......填充任何最适合你的地方 – MOnsDaR 2016-02-04 07:45:47

哪个Boost库?其中许多是纯模板,不需要链接。

编辑现在实际上表明具体的例子告诉我们,你想升压方案选择(甚至更告诉我们,你是在Ubuntu),你需要做两件事情:

  1. 安装libboost-program-options-dev这样就可以防止其链接
  2. 告诉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)完成。

+10

您的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}) 
+5

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

+0

这个目标方法的缺点是如果你的Boost版本比你的CMake版本更新,这可能会失败。 'FindBoost.cmake'最初只在明确列出你的Boost版本时才构建它们。在某些时候,这应该会得到改善,但我仍然看到CMake 3.10.2和Boost 1.66(酿造的最新副本)出现故障。 – 2018-02-23 11:36:03