如何使用CMake将C ++程序与Boost链接


109

将程序与Ubuntu下的Boost库链接时,我的CMake文件应该是什么样子?

运行期间显示的错误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}
)

Answers:


150

在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} )

我希望这段代码对您有所帮助。


2
从Kitwares Github存储库中添加了一个工作链接。还添加了有关FindBoost.cmake的官方文档的链接
MOnsDaR 2014年

1
为什么特别要提升1.40?库的基本功能何时停止更改?
jgyou

6
因为为什么不呢?这只是一个例子...填写最适合您的内容
MOnsDaR

5
一个重要的细节是地方target_link_libraries add_executable find_package线,因此所有连接部件都是已知的。
墨菲

52

以下是我的配置:

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} )

7
不需要link_directories,因为Boost_LIBRARIES将是标准路径。
罗伯特·梅纳德(RobertJMaynard)2014年

在我的情况下,link_directories是必要的。
mgruber4

25

使用导入的目标为现代CMake语法修改@MOnsDaR答案,这将是:

find_package(Boost 1.40 COMPONENTS program_options REQUIRED)

add_executable(anyExecutable myMain.cpp)

target_link_libraries(anyExecutable Boost::program_options)

请注意,由于已经通过导入的target进行了处理,因此不必手动指定include目录Boost::program_options


这种目标方法的缺点是,如果您的Boost版本比CMake版本新,则可能会失败。The FindBoost.cmake仅在显式列出您的Boost版本时才构建这些文件。在某些时候应该可以改善它,但是我仍然看到CMake 3.10.2和Boost 1.66(brew的最新副本)出现故障。
亨利·施莱纳

4
stackoverflow开始失败,因为答案太多了,常常很难找到正确的答案(这个答案)。
卡洛·伍德

3

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

现在,通过实际显示的具体示例告诉我们您需要Boost程序选项(甚至告诉我们您正在使用Ubuntu),您需要做两件事:

  1. 安装 libboost-program-options-dev以便可以链接到它。
  2. 告诉cmake链接反对libboost_program_options

我主要使用Makefiles,因此这是直接的命令行用法:

$ 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是通过SET(liblist boost_program_options)在中完成的CMakeLists.txt


11
您的CMake建议是错误的(请参阅接受的答案),并且您的命令行建议不是很有帮助,因为问题与CMake有关。
Ela782 2014年

3

两种方式,使用系统默认安装路径,通常是/usr/lib/x86_64-linux-gnu/

find_package(Boost REQUIRED regex date_time system filesystem thread graph)
include_directories(${BOOST_INCLUDE_DIRS})
message("boost lib: ${Boost_LIBRARIES}")
message("boost inc:${Boost_INCLUDE_DIR}")

add_executable(use_boost use_boost.cpp)
target_link_libraries(use_boost
        ${Boost_LIBRARIES}
        )

如果将Boost安装在本地目录中或选择本地安装而不是系统安装,则可以通过以下方式进行:

set( BOOST_ROOT "/home/xy/boost_install/lib/" CACHE PATH "Boost library path" )
set( Boost_NO_SYSTEM_PATHS on CACHE BOOL "Do not search system for Boost" )

find_package(Boost REQUIRED regex date_time system filesystem thread graph)
include_directories(${BOOST_INCLUDE_DIRS})
message("boost lib: ${Boost_LIBRARIES}, inc:${Boost_INCLUDE_DIR}")

add_executable(use_boost use_boost.cpp)
target_link_libraries(use_boost
        ${Boost_LIBRARIES}
        )

请注意,上面的目录/home/xy/boost_install/lib/是我安装Boost的位置:

xy@xy:~/boost_install/lib$ ll -th
total 16K
drwxrwxr-x 2 xy xy 4.0K May 28 19:23 lib/
drwxrwxr-x 3 xy xy 4.0K May 28 19:22 include/

xy@xy:~/boost_install/lib$ ll -th lib/
total 57M
drwxrwxr-x 2 xy xy 4.0K May 28 19:23 ./
-rw-rw-r-- 1 xy xy 2.3M May 28 19:23 libboost_test_exec_monitor.a
-rw-rw-r-- 1 xy xy 2.2M May 28 19:23 libboost_unit_test_framework.a
.......

xy@xy:~/boost_install/lib$ ll -th include/
total 20K
drwxrwxr-x 110 xy xy  12K May 28 19:22 boost/

如果您对如何使用本地安装的Boost感兴趣,则可以看到以下问题:如何让CMake查找替代的Boost安装?


2

这是我的看法:

cmake_minimum_required(VERSION 3.15)

project(TryOuts LANGUAGES CXX)

find_package(Boost QUIET REQUIRED COMPONENTS program_options)

if(NOT Boost_FOUND)
    message(FATAL_ERROR "Boost Not found")
endif()

add_executable(helloworld main.cpp)

target_link_libraries(helloworld PUBLIC Boost::program_options)

target_link_libraries(helloworld PUBLIC Boost :: program_options)将出现CMAKE错误:-在CMakeLists.txt:102(add_executable)上配置完成的CMake错误:目标“ DB32”链接到目标“ Boost :: program_options”,但未找到目标。也许缺少IMPORTED目标的find_package()调用,或者缺少ALIAS目标?
munsingh

您好,感谢您的反馈。看来CMake无法在您的系统上找到Boost。也许您最好从源头上重新构建Boost。在此之前,您可能需要尝试以下操作:使用查找包find_package(Boost QUIET REQUIRED)并链接到您的目标(DB32):target_link_libraries(DB32 PUBLIC Boost::headers)
adem
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.