CMake 和 pybind11 使用不一致的 Python 版本
CMake and pybind11 using inconsistent Python Versions
我正在 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(pybind11)
之前调用 set(PYBIND11_PYTHON_VERSION 3.8 CACHE STRING "")
解决了我的问题,尽管它不能帮助我理解为什么 pybind11 默认为 2.7。如果有人能指出我的解释,我将不胜感激。
我发现这个问题相当令人费解,我最终决定完全不使用 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、使用什么编译器标志等。
这似乎对我有用:
set(PYBIND11_PYTHON_VERSION 3)
set(PYBIND11_FINDPYTHON ON)
find_package(pybind11 CONFIG)
我正在 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(pybind11)
之前调用 set(PYBIND11_PYTHON_VERSION 3.8 CACHE STRING "")
解决了我的问题,尽管它不能帮助我理解为什么 pybind11 默认为 2.7。如果有人能指出我的解释,我将不胜感激。
我发现这个问题相当令人费解,我最终决定完全不使用 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、使用什么编译器标志等。
这似乎对我有用:
set(PYBIND11_PYTHON_VERSION 3)
set(PYBIND11_FINDPYTHON ON)
find_package(pybind11 CONFIG)