【问题标题】:How to properly link boost with cmake如何正确链接 boost 与 cmake
【发布时间】:2017-10-18 21:04:12
【问题描述】:

boost的根目录($ENV{BOOST_ROOT})是

C:\Boost\boost_1_64_0

所有编译的库(.dll、.lib)都在

C:\Boost\boost_1_64_0\lib64-msvc-14.1

它们同时具有 boost_xxx 和 libboost_xxx。

我的 cmake 文件是

set(BOOST_ROOT "$ENV{BOOST_ROOT}") 
set(BOOST_LIBRARYDIR "$ENV{BOOST_ROOT}/lib64-msvc-14.1")

message("${BOOST_ROOT}")
message("${BOOST_LIBRARYDIR}")
message("${Boost_INCLUDE_DIR}")

if(MSVC)
    add_definitions(-DBOOST_ALL_NO_LIB) 
    add_definitions(-DBOOST_ALL_DYN_LINK)
endif()

find_package(Boost 1.64.0 COMPONENTS system filesystem program_options REQUIRED)

输出是

C:\Boost\boost_1_64_0

C:\Boost\boost_1_64_0/lib64-msvc-14.1

C:/Boost/boost_1_64_0

C:/Program 处的 CMake 错误 文件/CMake/share/cmake-3.8/Modules/FindBoost.cmake:1842(消息):
找不到请求的 Boost 库。

Boost 版本:1.64.0

Boost 包含路径:C:/Boost/boost_1_64_0

找不到以下 Boost 库:

      boost_system
      boost_filesystem
      boost_program_options

未找到任何 Boost 库。您可能需要设置 BOOST_LIBRARYDIR 到包含 Boost 库的目录或 BOOST_ROOT 到 Boost的位置。调用堆栈(最近的调用优先):
CMakeLists.txt:78 (find_package)

CMakeLists.txt:84 处的 CMake 错误(消息):找不到提升

有人可以帮忙吗?我已经为此花费了几个小时,但无法弄清楚为什么这不起作用。

【问题讨论】:

  • 设置 BOOST_DEBUG 正是为了调试这种情况。这样做并显示结果日志。

标签: boost cmake


【解决方案1】:

首先,您使用什么 CMake 版本?最近,3.8.1 release 中包含了一个回归修复——它与 BOOST_ROOT 中的反斜杠有关。

其次,如果您使用的是官方预构建的 Windows 二进制文件,则无需指定其他任何内容(可能是 BOOST_ROOT)——FindBoost.cmake 也会尝试找到它们。 (遗憾的是我不记得是从哪个版本开始的。)

从不在您的CMakeLists.txt 中执行set(BOOST_ROOT...) -- 只需将此参数传递给cmake 通过-D 选项运行即可。更好的方法如下:

if(NOT DEFINED BOOST_ROOT AND NOT "${ENV{BOOST_ROOT}" STREQUAL "")
    set(BOOST_ROOT "$ENV{BOOST_ROOT}")
endif()

使用导入的目标来链接 w/ 所需的 Boost 库并修改每个 taget 的编译/链接器标志。请避免修改“全局”编译器/链接器选项——即使用相应的target_xxx 命令而不是add_definitions & 等。

【讨论】:

    【解决方案2】:

    我使用以下脚本通过 CMake 加载 boost(适用于 Linux 和 Windows):

    set(BoostPath "${DefaultBoostPath}" CACHE PATH "Path to Boost")
    message(STATUS "Path to Boost: ${BoostPath}")
    set(BOOST_ROOT "${BoostPath}")
    set(Boost_USE_MULTITHREAD ON)
    set(Boost_USE_STATIC_LIBS ON)
    set(Boost_NO_SYSTEM_PATHS ON)
    set(Boost_ADDITIONAL_VERSIONS "1.57.0" "1.57" "1.58.0" "1.58" "1.59.0" "1.59" "1.60.0" "1.60" "1.61.0" "1.61" "1.62.0" "1.62" "1.63.0" "1.63" "1.64.0" "1.64")
    find_package(Boost ${RequiredBoostVersion} REQUIRED COMPONENTS ${RequiredBoostComponents})
    mark_as_advanced(FORCE Boost_DIR)
    set(BoostVersion "${Boost_MAJOR_VERSION}.${Boost_MINOR_VERSION}.${Boost_SUBMINOR_VERSION}")
    message(STATUS "Boost version: ${BoostVersion}")
    if(CompilerName STREQUAL "gcc")
        set(System_LIBRARIES ${System_LIBRARIES} pthread rt)
    endif()
    

    您可以看到我必须添加一些版本的 Boost,因为我的 CMake 版本不知道最新版本。 你的 CMake 版本是什么?也许是同样的问题。

    【讨论】:

      【解决方案3】:

      您的标题在哪里?我认为它没有找到包含目录(这是成功所必需的)。

      在你的cmake安装目录中搜索FindBoost.cmake,里面有很多有用的东西可以帮助你解决问题。

      使用set(Boost_DEBUG ON) 可以帮助您确定搜索了哪些路径以及搜索了哪些库的文件名。您可以使用set(Boost_INCLUDEDIRS ${BOOST_ROOT}/inc) 指定包含目录(存储文件夹boost 的目录),尽管我刚刚展示的是 FindBoost.cmake 搜索的位置之一。

      另外,您不需要set(BOOST_ROOT "$ENV{BOOST_ROOT}")。如果您不设置 ${BOOST_ROOT},FindBoost.cmake 会为您执行此操作。

      请注意,如果您刚刚下载了 boost,将存档解压缩到 ${BOOST_ROOT} 并使用 b2 编译,那么您的所有文件都在 ${BOOST_ROOT}/stage 中。这也是他们居住的好地方。如果您手动将文件复制到其他地方,那么 FindBoost 可能会很难找到它们。

      【讨论】:

        猜你喜欢
        • 2017-01-28
        • 2018-09-25
        • 2019-01-31
        • 2015-11-23
        • 2011-04-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多