使用setuptools构建含NEON intrinsics的Pybind11扩展遇编译错误
尝试通过PyBind11+setuptools流程编译绑定使用NEON intrinsics的C++ Python扩展,持续触发编译错误:
arm_neon.h:28:2: error: "NEON intrinsics not available with the soft-float ABI. Please use -mfloat-abi=softfp or -mfloat-abi=hard"
#error "NEON intrinsics not available with the soft-float ABI. Please use -mfloat-abi=softfp or -mfloat-abi=hard"
复现步骤
- 克隆pybind/python_example仓库
- 在main.cpp中添加
#include <arm_neon.h> - 执行
pip install .或相关构建命令触发错误
已尝试的无效操作
- 在setup.py的
extra_compile_args中添加["-mfloat-abi=hard", "-O3", "-mcpu=native"],出现警告:clang: warning: argument unused during compilation: '-mfloat-abi=hard' [-Wunused-command-line-argument]
- 在setup.py顶部设置
os.environ["CC"] = "clang++"强制使用clang++,问题未解决 - 单独用clang编译独立C++文件可成功,确认问题出在setuptools配置环节
设备环境:Macbook Pro M2
解决方案
Apple Silicon(M2属于arm64架构)上的clang不支持Linux ARM的-mfloat-abi=hard参数,需调整编译参数并确保Python环境匹配架构:
修改setup.py的编译参数
将extra_compile_args替换为适合Apple Silicon的参数:extra_compile_args = [ "-O3", "-mcpu=native", "-arch", "arm64" ]-mcpu=native会自动启用当前M2芯片的NEON支持,-arch arm64确保编译目标为arm64架构。确认Python环境架构
执行以下命令检查Python是否为arm64版本:python -c "import platform; print(platform.machine())"如果输出为
x86_64,说明是Rosetta模拟环境,需安装arm64版本的Python(可从Python官网下载对应安装包,或通过Homebrew安装)。
内容的提问来源于stack exchange,提问作者Ooki

