4

我已经构建了 Boost 1.68(使用https://gist.github.com/sim642/29caef3cc8afaa273ce6的说明,并添加link=static,shared到 b2 命令行以构建共享库。)

这些库似乎可以正确构建,并且我已经正确设置了BOOST_INCLUDEDIRBOOST_LIBRARYDIR环境变量。

但是,当我将以下内容添加到 a 时CMakeLists.txt

find_package(Boost REQUIRED COMPONENTS system context coroutine thread random REQUIRED)

并生成MinGW Makefiles,我收到以下错误:

CMake Error at C:/Users/pbelanger/AppData/Local/JetBrains/Toolbox/apps/CLion/ch-0/182.4129.15/bin/cmake/win/share/cmake-3.12/Modules/FindBoost.cmake:2044 (message):
  Unable to find the requested Boost libraries.

  Boost version: 1.68.0

  Boost include path: C:/boost/install/include/boost-1_68

  Could not find the following static Boost libraries:

          boost_system
          boost_context
          boost_coroutine
          boost_thread
          boost_random

  Some (but not all) of the required Boost libraries were found.  You may
  need to install these additional Boost libraries.  Alternatively, set
  BOOST_LIBRARYDIR to the directory containing Boost libraries or BOOST_ROOT
  to the location of Boost.

我已将添加的输出放在set(Boost_DEBUG ON)此处find_packagehttps ://pastebin.com/yRd5DPt4

根据调试输出,查找脚本正在正确的目录 ( c:\boost\install\lib) 中搜索,但没有找到 boost 库,因为它们具有不同的命名方案。例如,system库名为libboost_system-mgw81-mt-x64-1_68.dll,但查找脚本将库名称传递boost_system-mgw81-mt-1_68给 CMake 的find_library. 请注意,寻址模型 ( -x64) 未列在后一个名称中。

我的问题是这是否是 Boost 或 findCMake 脚本的问题?这可以通过在 findCMake 脚本之前设置特定的 cmake 变量来解决吗?

4

2 回答 2

6

查看FindBoost.cmake1478 行的源代码,脚本查看 的值CMAKE_CXX_COMPILER_ARCHITECTURE_ID以构建正确的体系结构标记。但是,在我的编译器(MinGW-W64 8.1 64 位)上,这个字符串是空的。因此,架构标签被省略。

find_package我必须通过将以下内容放在我的行之前手动设置此变量的值:

if(WIN32 AND "x${CMAKE_CXX_COMPILER_ARCHITECTURE_ID}" STREQUAL "x")
    message(WARNING "WIN32 compiler does not specify CMAKE_CXX_COMPILER_ARCHITECTURE_ID -- filling in manually")
    if(CMAKE_SIZEOF_VOID_P EQUAL 8)
        set(CMAKE_CXX_COMPILER_ARCHITECTURE_ID "x64")
    else()
        set(CMAKE_CXX_COMPILER_ARCHITECTURE_ID "x86")
    endif()
    message(STATUS "Compiler architecture: ${CMAKE_CXX_COMPILER_ARCHITECTURE_ID}")
endif()

# now we should be able to find boost correctly. 
find_package(Boost REQUIRED COMPONENTS system context coroutine thread random REQUIRED)

这使得 find_package 可以正常工作。

于 2018-08-17T17:56:19.043 回答
6

经过数小时的研究,Paul Belanger 给出的答案挽救了我的一天。

在代码库中进一步挖掘,他们添加了一个新选项来管理这种情况,因此使用最新版本的 CMAKE,您可以添加以下选项:

set (Boost_ARCHITECTURE "-x64")

来源:https ://github.com/Kitware/CMake/commit/1e08b625c291e0bb57d253b6656e812dc8848bd8#diff-555801259d7df67368f7deab1f9deacd

于 2018-12-30T22:55:36.030 回答