无法找到Boost(缺少python3)(已找到版本“1.76.0”)- CMake Windows

4

我需要帮助解决这个问题:当尝试从ROS2编译cv_bridge时,遇到了cmake boost python3查找问题。ROS2使用名为colcon的构建工具,进而使用CMake。colcon构建错误信息如下:

> colcon build --symlink-install --merge-install
...    
--- stderr: cv_bridge
    CMake Error at C:/Program Files/CMake/share/cmake-3.22/Modules/FindPackageHandleStandardArgs.cmake:230 (message):
      Could NOT find Boost (missing: python3) (found version "1.76.0")
    Call Stack (most recent call first):
      C:/Program Files/CMake/share/cmake-3.22/Modules/FindPackageHandleStandardArgs.cmake:594 (_FPHSA_FAILURE_MESSAGE)
      C:/Program Files/CMake/share/cmake-3.22/Modules/FindBoost.cmake:2360 (find_package_handle_standard_args)
      CMakeLists.txt:32 (find_package)

我尝试过的方法:

  • 安装不同版本的boost:1.58、1.67、1.76
  • 在cv_bridge的CMakeLists.txt中将Boost_INCLUDE_DIRS添加到boost库的路径中:
     if(NOT ANDROID)
          find_package(PythonLibs)
          list(APPEND Boost_INCLUDE_DIRS "C:/Program Files/boost/boost_1_76_0")
          list(APPEND Boost_INCLUDE_DIRS "C:/Program Files/boost/boost_1_76_0/stage/lib")
  • libboost_python38-vc142-mt-gd-x64-1_76.lib 重命名为 libboost_python38.liblibboost_python3.lib
  • 使用 bootstrap.batb2 编译Boost源代码或者使用zip文件安装。
  • 在这里和其他地方寻求答案,尝试了上述方法。

我已经没有更多的想法了,请大家帮帮我!


尝试使用配置版本的 find_package 来定位 Boost。在使用 find_package 之前设置 Boost_ROOT;或者使用 b2(.\b2 ... "--prefix=some/path" ... install)将安装 Boost 的目录添加到 CMAKE_PREFIX_PATH 中。find_package(Boost REQUIRED COMPONENTS python CONFIG)。此外,请注意自 CMake 3.12 起,FindPythonLibs 模块 已被弃用。 - fabian
谢谢Fabian!我尝试设置Boost_ROOT,但需要将策略CMP0074设置为NEW,但没有成功。同样地,将C:\Program Files\boost\boost_1_76_0添加到CMAKE_PREFIX_PATH也不起作用。配置版本也不行。由于不存在FindPython3Config.cmake,配置版本无法找到它。我在这个线程中发现,似乎自Boost 1.70以来,cmake配置停止在指定的位置查找... - Lora
3个回答

4

我在Fedora编译ROS Noetic时遇到了类似的问题。它能够找到Boost 1.76.0,所以我认为问题应该出在Python组件上。我猜它没有找到正确的libboost_python版本。所以当我检查库时,我发现它位于此位置:/usr/lib64/libboost_python310.so。因此,我更新了cv_bridge/CMakeLists.txt,专门使用3.10版本:

if(NOT ANDROID)
  find_package(PythonLibs)

  if(PYTHONLIBS_VERSION_STRING VERSION_LESS "3.8")
    # Debian Buster
    find_package(Boost REQUIRED python37)
  else()
    # Ubuntu Focal
    
    # Because I am using python 3.10 I updated
    # this line. If you are using a version less
    # than 3.8, then update the previous line

    # Updated line
    find_package(Boost REQUIRED python310)
  endif()
else()
find_package(Boost REQUIRED)
endif()

将其设置为特定地查找3.10版本解决了问题,我能够编译。

编辑: 没有意识到问题是针对Windows平台的,但这个答案仍然可能有帮助。


那个完美地运行了 - 我也在 Fedora 上构建 ROS Noetic。非常感谢! - Tony Pierce

1

经过几天的苦恼后,我使用 预编译的 Boost 1.74 并更改了 cv_bridge/CMakeLists.txt 中与 boost/python 相关的部分,才最终解决了这个问题。

...
set(BOOST_ROOT <your/path/to/boost_1_74_0>)

find_package (Python3 REQUIRED COMPONENTS Interpreter Development)
if(NOT ANDROID)
    find_package(Boost QUIET)
    if(Boost_VERSION LESS 106500)
        find_package(Boost REQUIRED python)
    else()
        # This is a bit of a hack to suppress a warning
        #   No header defined for python3; skipping header check
        # Which should only affect Boost versions < 1.67
        # Resolution for newer versions:
        #  https://gitlab.kitware.com/cmake/cmake/issues/16391
        if (Boost_VERSION LESS 106700)
            set(_Boost_PYTHON3_HEADERS "boost/python.hpp")
        endif()
        find_package(Boost COMPONENTS python${Python3_VERSION_MAJOR}.${Python3_VERSION_MINOR} REQUIRED)
    endif()
else()
    find_package(Boost REQUIRED)
endif()
find_package(sensor_msgs REQUIRED)
...

不要忘记在再次触发colcon构建之前删除构建和安装文件夹。

1
我差点放弃了。是的,预编译的 Boost 真的起到了作用。谢谢! - Lora

0

我曾经遇到过同样的问题。我尝试将lib和include文件夹以及库本身明确地提供给cmake,还尝试将libboost_python37-vc143-mt-x64-1_78.lib重命名为libboost_python3.lib,但这些都没有起作用。

最终解决方法是直接提供cmake的根目录:

cmake -DBOOST_ROOT=C:\\Boost ..

在我的情况下,C:\\Boost 包含我使用以下命令创建的 libinclude 文件夹:
.\b2 --with-python -j16 --prefix=C:\Boost --libdir=C:\Boost\lib --includedir=C:\Boost\include install

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