【问题标题】:Cmake doesn't find BoostCmake 找不到 Boost
【发布时间】:2011-04-18 01:12:40
【问题描述】:

我正在尝试使用 CMake 配置项目,但它无法找到 Boost 库,即使它们位于指定的文件夹中。我已经指定了 Boost_INCLUDE_DIRBoost_LIBRARYDIRBOOST_ROOT ,但我仍然收到一条错误消息,指出 CMake 无法找到 Boost。出现这种错误的原因可能是什么?

【问题讨论】:

  • 某些版本的 Boost 使用标志 Boost_INCLUDE_DIR,而其他版本使用标志 Boost_INCLUDEDIR不带下划线)。您可以通过阅读FindBoost.cmake 文件(位于path-to-cmake/Modules/FindBoost.cmake 下)来检查适合您情况的文件
  • 仅供参考,如果您使用 CMake 支持构建 boost,您应该使用 find_package(Boost CONFIG)

标签: boost cmake


【解决方案1】:

你确定你的做法是正确的吗?这个想法是 CMake 自动设置BOOST_INCLUDE_DIRBOOST_LIBRARYDIRBOOST_ROOT。在CMakeLists.txt 中做这样的事情:

FIND_PACKAGE(Boost)
IF (Boost_FOUND)
    INCLUDE_DIRECTORIES(${Boost_INCLUDE_DIR})
    ADD_DEFINITIONS( "-DHAS_BOOST" )
ENDIF()

如果 boost 没有安装在默认位置,因此 CMake 找不到,您可以告诉 CMake 在哪里寻找 boost,如下所示:

SET(CMAKE_INCLUDE_PATH ${CMAKE_INCLUDE_PATH} "C:/win32libs/boost")
SET(CMAKE_LIBRARY_PATH ${CMAKE_LIBRARY_PATH} "C:/win32libs/boost/lib")

当然,这两行必须在CMakeLists.txt 中的FIND_PACKAGE(Boost) 之前

【讨论】:

  • 这是${Boost_INCLUDE_DIR} 而不是${BOOST_INCLUDE_DIR},大小写很重要。
  • 也许这在较新版本的 cmake 中有所改变,但这里是参考文档:cmake.org/cmake/help/v3.0/module/FindBoost.html
  • 它对我不起作用...它找到了 boost 库,但在编译时会产生大量错误
  • 不应该是'BOOST_INCLUDEDIR'吗?
  • @IhorKaharlichenko,但 BOOST_ROOT 应该是 BOOST_ROOT。精彩的 !让我尝试所有情况,驼峰式,所有大写,带下划线,不带下划线...
【解决方案2】:

阅读FindBoost.cmake 文件本身可以获得更多帮助。它位于您的“模块”目录中。

一个好的开始是set(Boost_DEBUG 1) - 这将吐出大量关于 boost 在哪里寻找的信息,它正在寻找什么,并且可能有助于解释为什么它找不到它。

它还可以帮助您确定它是否正确地接收了您的 BOOST_ROOT

FindBoost.cmake 有时也会在可用版本变量中未列出 boost 的确切版本时出现问题。您可以通过阅读FindBoost.cmake 找到更多相关信息。

最后,FindBoost.cmake 过去有过一些错误。您可能会尝试的一件事是从最新版本的 CMake 中取出更新版本的 FindBoost.cmake,并将其粘贴到与 CMakeLists.txt 一起的项目文件夹中 - 然后即使您有旧版本的 boost,它也会使用FindBoost.cmake 的新版本,位于您的项目文件夹中。

祝你好运。

【讨论】:

    【解决方案3】:

    对我来说,这个错误仅仅是因为 ubuntu 上没有安装 boost:

    sudo apt install build-essential libboost-system-dev libboost-thread-dev libboost-program-options-dev libboost-test-dev

    【讨论】:

      【解决方案4】:

      我自己在这个问题上苦苦挣扎了一段时间。事实证明,cmake 正在使用 Boost 的命名约定查找 Boost 库文件,其中库名称是用于构建它的编译器版本的函数。我们的 Boost 库是使用 GCC 4.9.1 构建的,并且该编译器版本实际上存在于我们的系统中;但是,GCC 4.4.7 也恰好安装了。碰巧的是,cmake 的 FindBoost.cmake 脚本自动检测了 GCC 4.4.7 安装而不是 GCC 4.9.1 安装,因此正在寻找文件名中带有“gcc44”的 Boost 库文件,而不是“@987654328” @"。

      简单的解决方法是通过在CMakeLists.txt 中将Boost_COMPILER 设置为“-gcc49”来强制cmake 假设存在GCC 4.9。通过此更改,FindBoost.cmake 查找并找到了我的 Boost 库文件。

      【讨论】:

        【解决方案5】:

        您还可以通过传递 -DBOOST_INCLUDEDIR-DBOOST_ROOT 指向正确版本提升标头的位置来指定您希望 CMake 使用的 Boost 版本

        例子:

        cmake -DBOOST_ROOT=/opt/latestboost

        当多个 boost 版本在同一个系统上时,这也很有用。

        【讨论】:

        • 谢谢,Avro build for Windows 对我有用。
        • 为我工作,在 CMake GUI 工具中将其设置为环境...然后添加条目,然后 BOOST_ROOT,值 C:\Program Files\PCL 1.11.1\3rdParty\Boost(我有已安装 PCL)
        【解决方案6】:

        我也遇到了类似的问题,发现 BOOST_INCLUDE_DIR、BOOST_LIBRARYDIR 和 BOOST_ROOT 环境变量必须包含 绝对 路径。 HTH!

        【讨论】:

        • 是的。由于 BOOST_ROOT 环境中的相对路径,遇到了同样的问题。非常感谢你!
        【解决方案7】:

        在我的情况下,没有安装 Boost。我在 Mac 上使用了下面的命令,然后 cmake find_package(Boost) 就像一个魅力

        brew install Boost
        

        请注意 Boost 中的大写“B”!

        【讨论】:

          【解决方案8】:

          对于cmake版本3.1.0-rc2boost 1.57指定-D_boost_TEST_VERSIONS=1.57

          cmake version 3.1.0-rc2 默认为 boost<=1.56.0,如使用 -DBoost_DEBUG=ON 所见

          cmake -D_boost_TEST_VERSIONS=1.57 -DBoost_DEBUG=ON -DCMAKE_BUILD_TYPE=Debug -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++

          【讨论】:

            【解决方案9】:

            如果您正在构建自己的 boost,请不要忘记使用 --layout=versioned,否则搜索特定版本的库将失败

            【讨论】:

              【解决方案10】:

              对于任何尝试构建CGAL 的人,特别是使用静态链接的 Boost,还有一点建议。定义Boost_USE_STATIC_LIBS是不够的;它在Boost_DEBUG 输出其值时被覆盖。这里要做的是选中“高级”复选框并启用CGAL_Boost_USE_STATIC_LIBS

              【讨论】:

                【解决方案11】:

                在 Ubuntu Trusty64 上安装 Boost 版本 1.66.0 后,我在尝试为项目运行 make 时遇到了同样的问题。错误消息类似于(不完全像)这个:

                CMake Error at     
                /usr/local/Cellar/cmake/3.3.2/share/cmake/Modules/FindBoost.cmake:1245 (message):
                Unable to find the requested Boost libraries.
                Boost version: 0.0.0
                Boost include path: /usr/include
                Detected version of Boost is too old.  Requested version was 1.36 (or newer).
                Call Stack (most recent call first):
                CMakeLists.txt:10 (FIND_PACKAGE)
                

                Boost 确实已安装,但 CMake 无法检测到它。在花费大量时间修改路径和环境变量之后,我最终检查了cmake 本身的选项,并发现了以下内容:

                --check-system-vars        = Find problems with variable usage in system files
                

                所以我在有问题的目录中运行了以下内容:

                sudo cmake --check-system-vars

                返回:

                Also check system files when warning about unused and uninitialized variables.
                -- Boost version: 1.66.0
                -- Found the following Boost libraries:
                --   system
                --   filesystem
                --   thread
                --   date_time
                --   chrono
                --   regex
                --   serialization
                --   program_options
                -- Found Git: /usr/bin/git
                -- Configuring done
                -- Generating done
                -- Build files have been written to: /home/user/myproject
                

                并解决了问题。

                【讨论】:

                  【解决方案12】:

                  我遇到了同样的问题,上述解决方案均无效。实际上,文件include/boost/version.hpp 无法读取(通过 jenkins 启动的 cmake 脚本)。

                  我不得不手动更改(boost)库的权限(即使 jenkins 属于该组,但这是与 jenkins 相关的另一个我无法弄清楚的问题):

                  chmod o+wx ${BOOST_ROOT} -R # allow reading/execution on the whole library
                  #chmod g+wx ${BOOST_ROOT} -R # this did not suffice, strangely, but it is another story I guess
                  

                  【讨论】:

                    【解决方案13】:

                    如果CMAKE_FIND_ROOT_PATH 设置为不同于BOOST_ROOT,也会发生这种情况。 我遇到了同样的问题,尽管设置了BOOST_ROOT,但我收到了错误。 但是对于 ARM 的交叉编译,我使用的是 Toolchain-android.cmake(出于某种原因):

                    set(BOOST_ROOT "/home/.../boost")
                    set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} --sysroot=${SYSROOT}")
                    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} --sysroot=${SYSROOT} -I${SYSROOT}/include/libcxx")
                    set(CMAKE_CXX_LINK_FLAGS "${CMAKE_CXX_LINK_FLAGS}")
                    set(CMAKE_FIND_ROOT_PATH "${SYSROOT}")
                    

                    CMAKE_FIND_ROOT_PATH 似乎覆盖了导致问题的BOOST_ROOT

                    【讨论】:

                      【解决方案14】:

                      请先查看FindBoost.cmake。您设置的变量是正确的,但它们应该都是大写的。

                      确保库架构与 CMake 配置匹配。

                      cmake -A x64 ..
                      

                      我建议创建一个仅包含 Boost 库的最小可执行文件,以查看它是否可以编译。

                      #include <iostream>
                      #include <boost/date_time.hpp>
                      int main() {
                          using namespace std;
                          using namespace boost::gregorian;
                          date today = day_clock::local_day();
                          cout << today << endl;
                      }
                      
                      find_package(Boost REQUIRED COMPONENTS
                        date_time
                      )
                      
                      include_directories(${Boost_INCLUDE_DIR})
                      link_directories(${Boost_LIBRARY_DIRS})
                      
                      add_executable(test_boost "test_boost.cpp")
                      target_link_libraries(test_boost Boost::date_time)
                      

                      首先检查Boost_FOUND,开始调试。

                      message(STATUS "Boost_FOUND: ${Boost_FOUND}")
                      

                      即使没有找到库,也应该找到版本。 (Boost_VERSION)

                      如果Boost_LIBRARY_DIRS 变为非空,它应该编译。

                      【讨论】:

                        【解决方案15】:

                        也许

                        brew install boost
                        

                        会帮助你。

                        【讨论】:

                          猜你喜欢
                          • 2011-12-26
                          • 2022-01-02
                          • 1970-01-01
                          • 1970-01-01
                          • 1970-01-01
                          • 1970-01-01
                          • 2017-06-28
                          相关资源
                          最近更新 更多