【问题标题】:CMake and pybind11 using inconsistent Python VersionsCMake 和 pybind11 使用不一致的 Python 版本
【发布时间】:2020-07-07 11:04:17
【问题描述】:

我正在 Ubuntu (20.04) 上的 VSCode (1.46.1) 中使用 CMake (3.16.3) 和 pybind11 (2.4.3) 创建一个入门项目,默认情况下它同时具有 Python 2.7 和 3.8。我想为 Python3 构建一个模块。当我在 CMakeLists.txt 中使用以下两行时

find_package(pybind11)
find_package(Python COMPONENTS Interpreter Development REQUIRED)

CMake 配置是

[cmake] -- Found PythonInterp: /usr/bin/python (found version "2.7.18")  
[cmake] -- Found PythonLibs: /usr/lib/x86_64-linux-gnu/libpython2.7.so  
[cmake] -- Found Python3: /usr/bin/python3.8 (found version "3.8.2") found components: Interpreter Development 

切换 find_package 语句的顺序

find_package(Python COMPONENTS Interpreter Development REQUIRED)
find_package(pybind11)

提供相同的 python 链接,但使用新的顺序

[cmake] -- Found Python: /usr/bin/python3.8 (found version "3.8.2") found components: Interpreter Development 
[cmake] -- Found PythonInterp: /usr/bin/python (found version "2.7.18") 
[cmake] -- Found PythonLibs: /usr/lib/x86_64-linux-gnu/libpython2.7.so

我是新手。我已阅读 in the FAQ 关于不一致版本的内容,但我认为我做的所有事情都是正确的(我不调用 find_package(PythonInterp) 或 find_package(PythonLibs),而是坚持使用 find_package(Python))。这似乎工作,似乎 find_package(pybind11) 默认为 python2.7 (如果我理解文档不正确),我不知道如何设置它。我尝试过# set(bindings_python_version 3.8) 之类的东西,但这并没有改变任何东西。

我在一台基于 Windows 的机器上工作,但它只有一个版本的 Python,所以没有混淆的机会

【问题讨论】:

  • 我通过在 find_package(Python3...) 之后调用 set(PYTHON_EXECUTABLE ${Python3_EXECUTABLE}) 解决了这个问题。我猜你可以对 find_package(Python) 做同样的事情

标签: cmake pybind11


【解决方案1】:

所以最后,在调用find_package(pybind11) 之前调用set(PYBIND11_PYTHON_VERSION 3.8 CACHE STRING "") 解决了我的问题,尽管它不能帮助我理解为什么pybind11 默认为2.7。如果有人能指出我的解释,我将不胜感激。

【讨论】:

    【解决方案2】:

    我发现这个问题相当令人困惑,我最终决定根本不使用pybind11_add_module。在查看代码后,很明显pybind11_add_module 并没有做任何复杂或重要的事情,同时做了许多干扰 CMake 项目其余部分的事情(搜索它自己的 Python,设置编译器选项)。总之,避免它让每个人的生活变得更简单。

    相反,只需定义一个设置正确包含路径的目标

    add_library(pybind11::pybind11 IMPORTED)
    target_include_directories(pybind11::pybind11 INTERFACE ${PATH_TO_PYBIND11})
    

    还要确保 Python 可用于您的 CMake 项目

    find_package(Python3 COMPONENTS Interpreter Development)
    

    然后以标准 Python 方式定义您的 python 模块,并像添加任何其他库一样将 pybind11 库添加到它们中

    Python3_add_library(MyModule MODULE PythonInterface.cpp)
    target_link_libraries(MyModule PRIVATE pybind11::pybind11)
    

    您可以以通常的方式添加多个源文件、编译器标志、库等,并且您可以完全控制使用哪个 Python、使用哪些编译器标志等等。

    【讨论】:

      【解决方案3】:

      这似乎对我有用:

      set(PYBIND11_PYTHON_VERSION 3)
      set(PYBIND11_FINDPYTHON ON)
      find_package(pybind11 CONFIG)
      

      【讨论】:

        猜你喜欢
        • 2021-10-17
        • 2021-12-15
        • 2020-09-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-09-18
        • 2013-02-23
        • 1970-01-01
        相关资源
        最近更新 更多