我正在构建一个Python模块,我想将其分发到多个Linux发行版,其中一些发行版的gcc版本比我正在构建的版本要低,因此我使用manylinux。特别是,我使用的是 manylinux_2_28,它基于 alma(Red Hat 系列)并提供 gcc12。
下载镜像后,我克隆了我的存储库,并且几乎已经让 CMake 配置可以工作了。问题始于
find_package(Python3 ${REQUESTED_PYTHON_VERSION} COMPONENTS Interpreter Development)
这给出了
Could NOT find Python3 (missing: Python3_LIBRARIES Development Development.Embed) (found version "3.12.3")
随后引入 pybind11 时出现配置错误。
图片提供Python
CPython 3.6、3.7、3.8、3.9、3.10、3.11、3.12、3.13 和 PyPy 3.7、3.8、3.9、3.10 安装在 /opt/python/- 中。这些目录以每个环境的 PEP 425 标签命名——例如/opt/python/cp37-cp37m 包含 CPython 3.7 版本,可用于生成名为 --cp37-cp37m-.whl 的轮子。
因此,在配置之前,我在
PATH
前面加上 /opt/python/cp312-cp312/bin
,以便 which python3
=> /opt/python/cp312-cp312/bin/python3
。
我最初的问题是如何克服这个问题。然而,通过更多的搜索,我在CMake discourse上找到了答案。 IE。使用
Development.Module
而不是 Development
。
find_package(Python3 ${REQUESTED_PYTHON_VERSION} COMPONENTS Interpreter Development.Module)
正如我所希望的那样,Python 开发已经适用于每个版本。但这里发生了什么? CMake 实际寻找的是
Development.Module
而不是 Development
,以及 gcc / 链接器想要的底层文件是什么——大概这些是 include
中
lib
和
/opt/python/cp312-cp312/
下的文件?
自 CMake 3.18 起,FindPython 模块 将
Development
拆分为 Development.Module
和 Development.Embed
。前者是创建Python模块,后者是创建嵌入Python解释器的程序。
许多linux都有用于创建模块的库,但没有用于嵌入式Python的库。所以在Manylinux上你必须使用
Development.Module
。
顺便说一句,您应该使用
find_package(Python …)
而不是 find_package(Python3 …)
。当必须同时管理 Python 2 和 3 时,需要 FindPython2
和 FindPython3
模块。 Python 2 已经生命终结很长一段时间了,Python 如今始终是 Python 3。通过不在任何地方明确使用“Python 3”,当 Python 4 到来时,转换到 Python 4 会更容易。