如何用Shiboken6生成abi3兼容的Wheel包?
构建abi3兼容的PySide/Shiboken Wheel包
核心解决方案:通过CMake传递FORCE_LIMITED_API参数
你没直接包含Python.h没关系——Shiboken绑定生成器内部会处理Python API调用,所以通过CMake定义FORCE_LIMITED_API变量是正确路径,这个参数会让Shiboken自动在生成的绑定代码中启用Py_LIMITED_API宏,限制使用ABI3兼容的API子集。
具体操作步骤
1. 配置CMake参数
方式一:修改CMakeLists.txt
在项目的CMake配置文件中添加:
# 开启ABI3兼容模式 set(FORCE_LIMITED_API ON CACHE BOOL "Force limited Python API for bindings") set(Python_LIMITED_API ON CACHE BOOL "Use Python's limited API") # 指定ABI3兼容的最低Python版本(比如3.6,是abi3最早支持的版本) set(Python_VERSION_MIN_REQUIRED 3.6)
方式二:在setup.py中传递给scikit-build
如果用scikit-build管理构建,直接在setup.py的cmake_args里添加参数:
from skbuild import setup setup( # 你的项目其他配置... cmake_args=[ "-DFORCE_LIMITED_API=ON", "-DPython_LIMITED_API=ON", "-DPython_VERSION_MIN_REQUIRED=3.6", ] )
2. 验证绑定代码
构建时Shiboken会自动在生成的绑定代码头部插入类似以下内容,完全符合Python官方对Py_LIMITED_API的要求:
#define Py_LIMITED_API 0x03060000 #include <Python.h>
3. 构建并修复Wheel
用scikit-build完成构建后,使用repairwheel处理时确保生成abi3标签的包:
repairwheel --plat manylinux_2_24_x86_64 --wheel-dir dist/ --output-dir dist/abi3/
最终生成的Wheel标签会是cp36-abi3-manylinux_2_24_x86_64(对应你指定的最低Python版本)。
关键注意点
FORCE_LIMITED_API是Shiboken社区实践中的标准变量,尽管未在官方文档中重点说明,但确实是实现abi3兼容的有效手段。- 如果你有自定义C++扩展代码,也要确保只使用ABI3允许的Python API,避免调用受限范围外的函数。
- 完成构建后,务必在多个Python版本(如3.6、3.10、3.12)上测试Wheel的兼容性。
内容的提问来源于stack exchange,提问作者Kleag
相关产品推荐
相关产品推荐

