如何在 CMakeLists.txt 中添加 Boost 库?

我需要将 Boost 库添加到我的 CMakeLists.txt 中?

193115 次浏览

将其放入 CMakeLists.txt文件中(如果需要,可以将任何选项从 OFF 更改为 ON) :

set(Boost_USE_STATIC_LIBS OFF)
set(Boost_USE_MULTITHREADED ON)
set(Boost_USE_STATIC_RUNTIME OFF)
find_package(Boost 1.45.0 COMPONENTS *boost libraries here*)


if(Boost_FOUND)
include_directories(${Boost_INCLUDE_DIRS})
add_executable(progname file1.cxx file2.cxx)
target_link_libraries(progname ${Boost_LIBRARIES})
endif()

显然你需要把你想要的库放在我放 *boost libraries here*的地方。例如,如果您正在使用 filesystemregex库,那么您应该写:

find_package(Boost 1.45.0 COMPONENTS filesystem regex)

您可以使用 Find _ package搜索可用的提升库。它将搜索 Boost 推迟到 FindBoost.cmake,这是 CMake 默认安装的。

在找到 Boost 时,find_package()调用将填充许多变量(请检查 FindBoost.cmake的引用)。其中包括 BOOST_INCLUDE_DIRS、 Boost _ LIBRARIES 和 Boost _ XXX _ LIBRARY 变量,XXX 被特定的 Boost 库取代。您可以使用它们来指定 Include _ directory 包括 _ 目录Target _ link _ library

例如,假设您需要 ost: : program _ options 和 ost: : regex,那么您将执行以下操作:

find_package( Boost REQUIRED COMPONENTS program_options regex )
include_directories( ${Boost_INCLUDE_DIRS} )
add_executable( run main.cpp ) # Example application based on main.cpp


# Alternatively you could use ${Boost_LIBRARIES} here.
target_link_libraries( run ${Boost_PROGRAM_OPTIONS_LIBRARY} ${Boost_REGEX_LIBRARY} )

一些小贴士:

  • 搜索时,FindBoost 检查环境变量 $ENV { BOOST _ ROOT }。
  • 当您有多个升级构建版本(多线程、静态、共享等)时,您可以在调用 find _ package 之前指定所需的配置。通过将以下一些变量设置为 On来完成此操作: Boost_USE_STATIC_LIBSBoost_USE_MULTITHREADEDBoost_USE_STATIC_RUNTIME
  • 在 Windows 上搜索 Boost 时,请注意自动链接。阅读 参考文献中的“ VisualStudio 用户注意事项”。
    • 我的建议是禁用自动链接并使用 cmake 的依赖处理: add_definitions( -DBOOST_ALL_NO_LIB )
    • 在某些情况下,可能需要显式指定使用动态 Boost: add_definitions( -DBOOST_ALL_DYN_LINK )

我同意 12的答案。但是,我更喜欢分别指定每个库。这使得大型项目中的依赖关系更加清晰。 然而,输入(区分大小写的)变量名是有危险的。 在这种情况下,没有直接的 cmake 错误,但是以后会出现一些未定义的引用链接器问题,这可能需要一些时间来解决。因此,我使用以下 cmake 函数:

function(VerifyVarDefined)
foreach(lib ${ARGV})
if(DEFINED ${lib})
else(DEFINED ${lib})
message(SEND_ERROR "Variable ${lib} is not defined")
endif(DEFINED ${lib})
endforeach()
endfunction(VerifyVarDefined)

对于上面提到的例子,这看起来像:

VerifyVarDefined(Boost_PROGRAM_OPTIONS_LIBRARY Boost_REGEX_LIBRARY)
target_link_libraries( run ${Boost_PROGRAM_OPTIONS_LIBRARY} ${Boost_REGEX_LIBRARY} )

如果我编写了“ BOOST _ PROGRAM _ OPTION _ LIBRARY”,那么 cmake 将会触发一个错误,而链接器不会在很久之后触发。

将@LainIwakura 的答案改编成现代 CMake 语法和导入的目标,如下所示:

set(Boost_USE_STATIC_LIBS OFF)
set(Boost_USE_MULTITHREADED ON)
set(Boost_USE_STATIC_RUNTIME OFF)
find_package(Boost 1.45.0 COMPONENTS filesystem regex)


if(Boost_FOUND)
add_executable(progname file1.cxx file2.cxx)
target_link_libraries(progname Boost::filesystem Boost::regex)
endif()

请注意,不再需要手动指定 include 目录,因为它已经通过导入的目标 Boost::filesystemBoost::regex来处理。
regexfilesystem可以被您需要的任何提升库所替代。

希望这对某些人有所帮助,我犯了一个顽皮的错误: 未定义的对符号“ _ ZN5boost6system15system _ Category yEv”的引用 //usr/lib/x86 _ 64-linux-gnu/libost _ system. so. 1.58.0: 添加符号错误: 命令行中缺少 DSO Txt 有一些问题,不知为什么我没有显式地包含“ system”和“ filessystem”库。我在 CMakeLists.txt 中写了这些代码行

这些行是在创建项目的可执行文件之前的开始部分编写的,因为在这个阶段,我们不需要将 Boost 库链接到我们的项目可执行文件。

set(Boost_USE_STATIC_LIBS OFF)
set(Boost_USE_MULTITHREADED ON)
set(Boost_USE_STATIC_RUNTIME OFF)
set(Boost_NO_SYSTEM_PATHS TRUE)


if (Boost_NO_SYSTEM_PATHS)
set(BOOST_ROOT "${CMAKE_CURRENT_SOURCE_DIR}/../../3p/boost")
set(BOOST_INCLUDE_DIRS "${BOOST_ROOT}/include")
set(BOOST_LIBRARY_DIRS "${BOOST_ROOT}/lib")
endif (Boost_NO_SYSTEM_PATHS)




find_package(Boost COMPONENTS regex date_time system filesystem thread graph program_options)


find_package(Boost REQUIRED regex date_time system filesystem thread graph program_options)
find_package(Boost COMPONENTS program_options REQUIRED)

现在在文件的末尾,我通过考虑“ KeyPointValue”作为我的项目可执行文件来编写这些代码行。

if(Boost_FOUND)
include_directories(${BOOST_INCLUDE_DIRS})
link_directories(${Boost_LIBRARY_DIRS})
add_definitions(${Boost_DEFINITIONS})


include_directories(${Boost_INCLUDE_DIRS})
target_link_libraries(KeyPointEvaluation ${Boost_LIBRARIES})
target_link_libraries( KeyPointEvaluation ${Boost_PROGRAM_OPTIONS_LIBRARY} ${Boost_FILESYSTEM_LIBRARY} ${Boost_REGEX_LIBRARY} ${Boost_SYSTEM_LIBRARY})
endif()

试着说:

set(Boost_USE_STATIC_LIBS        ON)  # only find static libs
set(Boost_USE_DEBUG_LIBS         OFF) # ignore debug libs and
set(Boost_USE_RELEASE_LIBS       ON)  # only find release libs
set(Boost_USE_MULTITHREADED      ON)
set(Boost_USE_STATIC_RUNTIME    OFF)
find_package(Boost 1.66.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()

不要忘记将 foo 替换为您的项目名称,并将组件替换为您的项目名称!

对于那些仍然有问题的人,上述答案的附加信息。

  1. Cmake 的 FindBoost.cmake的最新版本可能不会持续下去 如果需要,添加它。
  2. 使用-DBoost _ DEBUG = 0配置标志查看有关问题的信息。
  3. 查看库 命名格式。如果需要,使用 Boost_COMPILERBoost_ARCHITECTURE后缀变量。

如果你使用自定义提升路径,首先设置 CMAKE_PREFIX_PATH,这样,cmake 可以找到你的自定义提升。

list(FIND CMAKE_PREFIX_PATH ${CUSTOME_BOOST_DEP_PREFIX} _INDEX)
if (_INDEX EQUAL -1)
list(APPEND CMAKE_PREFIX_PATH ${CUSTOME_BOOST_DEP_PREFIX})
# set(CMAKE_PREFIX_PATH ${CMAKE_PREFIX_PATH} PARENT_SCOPE)
endif ()

顺便说一下,如果在 subcmake 文件中运行以上代码,应该将 CMAKE_PREFIX_PATH设置回父范围。

set(CMAKE_PREFIX_PATH ${CMAKE_PREFIX_PATH} PARENT_SCOPE)

如果你想找到所有的组件的升压,使用下面的代码。

find_package(Boost 1.76 COMPONENTS ALL)