【问题标题】:CMake doesn't find Boost librariesCMake 找不到 Boost 库
【发布时间】:2011-12-26 00:47:13
【问题描述】:

我正在尝试使用 CMake 脚本在 Windows 上编译基于 Boost 的应用程序。 仅标头库工作正常,但 CMake 找不到库(找不到以下 Boost 库:boost_serialization)。 CMake 脚本的相关部分是:

# Path where CMake can find additional libraries
SET(CMAKE_PREFIX_PATH Libs)

# Boost
SET(Boost_ADDITIONAL_VERSIONS "1.47" "1.47.0")
SET(Boost_USE_STATIC_LIBS   ON)
find_package(Boost REQUIRED COMPONENTS serialization)

我的项目中有一个名为“Libs”的文件夹,其中存储了 DevIL 和 Boost 等第三方库,所以我先设置了这个。它适用于 Devil 和 Boost 仅标头的东西,所以我认为我不需要 BOOST_ROOT 变量。 Boost 安装是来自 boost.org 的标准源代码分发,我使用 BJam 编译。这些库存储在boost_1_47_0\bin.v2\libs,我在构建过程中没有更改任何内容。

我认为这有点奇怪,boost_1_47_0\libs 文件夹不包含任何库文件,但 BJam 文件和其他东西,但这应该不是问题,因为这似乎是构建 Boost 的正常方式从源代码在 Windows 上。

我查看了 FindBoost.cmake 文件的调试输出(我使用的是 CMake 2.8 中的默认脚本),但它似乎没有查看 bin.v2。相反,它搜索boost_ROOT/lib,但是当我将内容从bin.v2\libs 复制到lib 时,它仍然没有找到任何东西。

那么,找到 Boost 并在其他具有常见 Boost 发行版的平台上工作的优雅方法是什么?

【问题讨论】:

    标签: windows boost cmake


    【解决方案1】:

    我会尝试在您的CMakeLists.txt 文件中设置BOOST_ROOT。我知道当您设置 Boost_ADDITIONAL_VERSIONS 变量时,CMake 2.8.6 会找到 Boost 1.47.0,因为当我设置了 BOOST_ROOT 时,它在 Windows 上适用。

    这是我在一个项目中所拥有的:

    设置(BOOST_COMPONENTS_NEEDED 序列化) # 下面验证 BOOST_ROOT 设置是否正确。 if(NOT BOOST_ROOT AND NOT $ENV{BOOST_ROOT} STREQUAL "") 文件(TO_CMAKE_PATH $ENV{BOOST_ROOT} BOOST_ROOT) 如果(不存在 ${BOOST_ROOT} ) MESSAGE( STATUS ${BOOST_ROOT} " 不存在。检查 BOOST_ROOT 是否是带引号的字符串.." ) 字符串(替换 "\"" "" BOOST_ROOT ${BOOST_ROOT} ) 如果(存在 ${BOOST_ROOT} ) MESSAGE( STATUS "删除引号后 " ${BOOST_ROOT} " 现在被 CMake 找到" ) endif(存在 ${BOOST_ROOT}) endif(不存在 ${BOOST_ROOT} ) # 将 BOOST_ROOT 保存在缓存中 如果(不存在 ${BOOST_ROOT} ) MESSAGE(警告 ${BOOST_ROOT} “不存在。”) 否则(不存在 ${BOOST_ROOT}) SET (BOOST_ROOT ${BOOST_ROOT} CACHE STRING "将 BOOST_ROOT 的值设置为指向您的 boost 安装的根文件夹。" FORCE) #SET (BOOST_INCLUDEDIR ${BOOST_ROOT}/包括) #SET (BOOST_LIBRARYDIR ${BOOST_ROOT}/lib) endif(不存在 ${BOOST_ROOT} ) endif(NOT BOOST_ROOT AND NOT $ENV{BOOST_ROOT} STREQUAL "") 如果(WIN32 而不是 BOOST_ROOT) MESSAGE( WARNING "请设置 BOOST_ROOT 环境变量。" ) endif(WIN32 而不是 BOOST_ROOT) 设置(Boost_ADDITIONAL_VERSIONS“1.47”“1.47.0”) 设置(Boost_DEBUG ON) 设置(Boost_USE_STATIC_LIBS OFF) 设置(Boost_USE_MULTITHREADED ON) 设置(Boost_USE_STATIC_RUNTIME OFF) FIND_PACKAGE(提升 1.47.0 组件 ${BOOST_COMPONENTS_NEEDED}) 如果(Boost_FOUND) MESSAGE( STATUS "设置升压。" ) 包含目录(${Boost_INCLUDE_DIRS}) 如果(升压调试) 消息(状态“增强库”${Boost_LIBRARIES}) FOREACH(BOOST_COMPONENT ${BOOST_COMPONENTS_NEEDED}) 字符串(TOUPPER ${BOOST_COMPONENT} BOOST_COMPONENT_UPCASE ) 消息(状态“提升”${BOOST_COMPONENT}“:”${Boost_${BOOST_COMPONENT_UPCASE}_LIBRARY}) 消息(状态“升压”${BOOST_COMPONENT}“调试:”${Boost_${BOOST_COMPONENT_UPCASE}_LIBRARY_DEBUG}) MESSAGE(状态“提升”${BOOST_COMPONENT}“发布:”${Boost_${BOOST_COMPONENT_UPCASE}_LIBRARY_RELEASE}) ENDFOREACH(BOOST_COMPONENT) endif(Boost_DEBUG) endif(Boost_FOUND)

    【讨论】:

    • 这对我帮助很大,感谢这个脚本。我想在 Boost_FOUND 之后添加一行: LINK_DIRECTORIES(${Boost_LIBRARY_DIRS}) 否则它一直说找不到库。希望这可以帮助其他有同样问题的人。
    • -- 找不到 Boost Boost 版本:1.60.0 Boost 包含路径:/usr/include 检测到的 Boost 版本太旧。请求的版本是 1.64(或更高版本)。 .....即使添加上面评论中提到的内容(Windows 10 / CLion)
    【解决方案2】:

    好吧,我解决了这个问题,但我对我的解决方案并不完全满意。

    在我看来,问题在于 BJam 创建了一个过于复杂的文件夹结构。现在我只是将库文件从“boost_1_47_0\bin.v2\libs\serialization\build\msvc-9.0\debug\link-static\threading-multi”复制到“boost_1_47_0\lib”。

    我必须手动执行此操作,但我没有使用那么多 Boost 库,所以我认为这一步是可以的。我将把我的解决方案记录在 CMake 脚本旁边,以便其他用户能够理解。

    【讨论】:

    • 我阅读了手册 (boost.org/doc/libs/1_48_0/more/getting_started/windows.html) 但使用了选项 5.2。我找到了包含所有库的 stage 目录,现在可以将其设置为我的 boost 库目录,但下次我将尝试选项 5.3。
    • 您也可以简单地复制 stage 和 boost (headers) 目录来制作您自己的 Boost 安装。例如boost/ -> C:\boost\include\boost and stage/* -> C:\boost\lib
    • 我遇到了同样的问题,我认为设置路径不应该是用户的任务,但这是我找到的唯一解决方案。库的文件夹结构应该与 find_package 保持一致。把事情复杂化是没有意义的。 CMake 旨在使用户的东西易于安装。
    【解决方案3】:

    我以前遇到过这个问题。出于某种原因,b2(又名 BJam)创建了带有前导“lib”的 Boost 库。

    CMake 脚本不会查找名为 libboost_thread.lib 的文件。它只会找到boost_thread.lib。删除前导 lib,CMake 应该会找到它们。

    【讨论】:

    • 我试过了,但是没有用还有一些库我真的不想重命名它们,以便 cmake 可以找到它们。在我看来,find_package 应该为我完成所有工作......
    • 不要重命名库。 “lib”前缀用于静态库,没有前缀用于 DLL。您应该改用 runtime-link=shared 构建。
    • @AndreasHaferburg 在我的情况下,我专门尝试将静态链接提升到我的应用程序中。
    【解决方案4】:

    我带着类似的问题来到这里,只是想说我的修复是相似的,但不完全相同。

    我的安装前缀是C:\lib\boost\boost_1_57_0。我设置了一个指向该目录的 BOOST_ROOT 环境变量,但 CMake (3.1.0) 仍然找不到标题。我意识到标头默认安装到C:\lib\boost\boost_1_57_0\include\boost-1_57\boost。我不打算运行多个版本,所以我只是将最终的 Boost 目录下移了一个并删除了 boost-1_57 目录并最终在此处显示标题:

    C:\lib\boost\boost_1_57_0\include\boost
    

    CMake 找到了一切。

    【讨论】:

    • 环境变量和CMake变量有区别吗?
    • 是的。 CMake 的FindBoost module 使用环境变量BOOST_ROOT 来尝试定位Boost。看起来较新的版本实际上也可能使用环境变量BOOSTROOT
    【解决方案5】:

    您可以在 CMake 的命令行中添加以下选项来告诉 CGAL 使用静态 Boost 库:

    -DCGAL_Boost_USE_STATIC_LIBS=true
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-02
      • 2019-12-29
      • 2020-11-29
      • 2017-07-19
      • 2012-08-14
      相关资源
      最近更新 更多