【问题标题】:CMake cannot find Boost on WindowsCMake 在 Windows 上找不到 Boost
【发布时间】:2020-12-18 13:08:56
【问题描述】:

我有一个非常简单的 CMake 文件,它在 linux 上运行良好,但在 windows 上,它说它找不到 boost(即使它似乎找到它,因为它说“找到合适的版本”)。这是初始构建文件:

cmake_minimum_required(VERSION 3.16.3)
project(filecompare)

set(CMAKE_CXX_STANDARD 20)

find_package(Boost 1.73.0 COMPONENTS program_options)

if(Boost_FOUND)
    include_directories(${Boost_INCLUDE_DIRS})
    add_executable(filecompare filecompare.cpp)
    target_link_libraries(filecompare ${Boost_LIBRARIES})
endif()

CMake 输出:

-- Could NOT find Boost (missing: Boost_INCLUDE_DIR program_options) (Required is at least version "1.73.0")
-- Configuring done
-- Generating done
-- Build files have been written to: C:/repos/filecompare/cmake-build-debug

所以它似乎无法自行找到库,所以我在 find_package 上方添加了这些行:

SET(CMAKE_INCLUDE_PATH ${CMAKE_INCLUDE_PATH} "C:/local/boost_1_73_0")
SET(CMAKE_LIBRARY_PATH ${CMAKE_LIBRARY_PATH} "C:/local/boost_1_73_0/lib64-msvc-14.2")

现在它似乎找到了库,但没有,这是输出:

-- Could NOT find Boost (missing: program_options) (found suitable version "1.73.0", minimum required is "1.73.0")
-- Configuring done
-- Generating done
-- Build files have been written to: C:/repos/filecompare/cmake-build-debug

我尝试设置如下内容:

set(Boost_USE_STATIC_LIBS ON)
set(Boost_USE_MULTITHREADED ON)
set(Boost_USE_STATIC_RUNTIME OFF)
SET(BOOST_ROOT "C:/local/boost_1_73_0/boost")

但这也无济于事。那么我在这里做错了什么?我在带有 VisualStudio 2019 的 CLion 上使用 clang-cl

【问题讨论】:

  • 您使用的是什么 CMake 版本? 3.16.3?然后,您的 CMake 版本不知道 Boost 版本 1.73.0,您应该尝试在您的 find_package(Boost ...) 调用之前添加 set( Boost_ADDITIONAL_VERSIONS 1.73.0 1.73)。在重新运行 CMake 之前,不要忘记删除 build 目录中的 CMakeCache.txt 文件。
  • @vre:这并没有解决它。我尝试添加这个,删除我的构建目录。还是一样的输出。我使用的 CMake 版本是 3.17.3。
  • find_package(Boost) 之前添加set(Boost_DEBUG ON) 并再次运行配置。其输出将包含信息实际 Boost 库,这些库被搜索和搜索位置。然后将此信息与您在 Boost 安装中的文件进行比较。
  • 仅供参考:如果您将 REQUIRED 关键字添加到 find_package 调用,则如果未找到 Boost,CMake 将自动终止。所以你可以省略对Boost_FOUND 变量的检查。
  • @Tsyvarev Boost_DEBUG 帮助:似乎它尝试了不同的库名称:搜索 PROGRAM_OPTIONS_LIBRARY_RELEASE: boost_program_options-clangw10-mt-x64-1_73;boost_program_options-clangw10-mt-x64;boost_program_options-clangw10-mt; boost_program_options-vc6-mt-x64-1_73;boost_program_options-vc6-mt-x64;boost_program_options-vc6-mt;boost_program_options-mt-x64-1_73;boost_program_options-mt-x64;boost_program_options-mt;boost_program_options-mt;boost_program_options 我的版本里面都有vc142。如何获取名称中包含 vc6 或 clangw10 的库版本?

标签: c++ boost cmake


【解决方案1】:

在我看来,您有两个不同的问题:

  1. CMake 不知道在哪里可以找到boost
  2. 您尚未为clang 构建boost 库二进制文件。

第一个问题很容易解决,而且您几乎做对了。要让CMake 找到boost,您需要设置:BOOST_ROOTBOOST_LIBRARYDIRCMake 将从这些变量生成CMAKE_INCLUDE_PATHCMAKE_LIBRARY_PATH。我通常将它们设置为环境变量;在您的情况下,它们应该是:

BOOST_ROOT C:/local/boost_1_73_0
BOOST_LIBRARYDIR C:/local/boost_1_73_0/lib64-msvc-14.2

假设lib64-msvc-14.2 是您使用clang 构建boost 库的位置?!
注意:库二进制文件(包括 dll,如果构建为共享)应位于名为 liblib64-msvc-14.2 的子目录中。

第二个问题是您需要为clang 构建boost 库,特别是program_options 库。

我只尝试使用clang 构建boost 一次,然后我只能构建32 位二进制文​​件,请参阅Building Boost with Clang “Failed to build Boost.build engine”。不过,那是 18 个月前的事了,从那时起情况可能有所改善。

请注意,我经常在 Windows 上使用 mingw (gcc) 构建的 boost 库,并且遇到 CMake 找不到 boost 的问题,请参阅:cmake FindBoost not finding Boost libraries when building with MinGW on Windowsclang 有类似的问题。许多C++ 库和工具(包括CMake)假定如果您使用的是Windows,那么您使用的是Visual Studio...

我建议首先使用 Visual Studio 进行构建,因为您已经拥有 Visual Studio 19 boost 库二进制文件。我还建议将 CMAKE_CXX_STANDARD 设置为 17,因为您目前正在将 一切 推到极限! :)

【讨论】:

  • 另一个可能的陷阱:在我的项目中,我有Boost_USE_STATIC_LIBS=ON,但我的MSVC 编译器三元组设置为x86-windows(没有-static)。 cmake 可以找到 boost,但不是静态库。