CMake在Windows上无法找到Boost库

4

我有一个非常简单的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")

但这也没有帮助。那么我在这里做错了什么?我正在使用CLion和VisualStudio 2019上的clang-cl。


@vre:这没解决问题。我尝试了添加这个,删除我的构建目录。仍然是相同的输出。我使用的CMake版本是3.17.3。 - gexicide
2
find_package(Boost) 之前添加 set(Boost_DEBUG ON) 并重新运行配置。输出将包含正在搜索的实际 Boost 库和搜索位置的信息。然后将此信息与您 Boost 安装中拥有的文件进行比较。 - Tsyvarev
1
如果在 find_package 调用中添加 REQUIRED 关键字,则 CMake 将自动终止,如果未找到 Boost。因此,您可以省略对 Boost_FOUND 变量的检查。 - Tsyvarev
@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名称的库版本? - gexicide
由于您使用Clang编译项目,因此需要以相同的方式编译Boost。不确定在Windows上可以获取由clang构建的现成Boost,但是您可以自己构建Boost。例如,请参见有关此主题的该问题 - Tsyvarev
显示剩余2条评论
1个回答

2
在我看来,你有两个不同的问题:
  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

假设您使用clang在lib64-msvc-14.2目录下构建了boost库?! 注意:库二进制文件(包括如果作为共享库构建的dll)应该在lib64-msvc-14.2的名为lib的子目录中。
第二个问题是您需要为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 Windows。我不会感到惊讶如果您在使用clang时遇到类似的问题。许多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,但无法找到静态库。 - Hermann

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接