使用uv安装SMAC3时依赖pyrfr==0.9.0编译失败的解决方案咨询(GCC 13+下rapidjson只读成员赋值错误)
适配uv环境的pyrfr编译/安装解决方案
这里有两个针对你问题的可行方案,完全符合你要求的uv包管理器+Docker root环境的限制:
1. 传递-fpermissive编译参数给pyrfr
你之前直接设置CXXFLAGS无效,是因为uv在构建包时会使用隔离的环境上下文,需要显式将环境变量传递给构建子进程。推荐两种方法:
方法一:全局传递编译参数
在安装命令前用env显式指定CXXFLAGS,确保参数被传递给GCC:
env CXXFLAGS="-fpermissive" uv add smac
方法二:精准针对pyrfr设置
如果只想给pyrfr单独设置编译参数,可以先单独安装pyrfr,用uv pip的--config-settings直接传递参数给setuptools:
uv pip install pyrfr==0.9.0 --config-settings setup-args=--cxxflags="-fpermissive" # 再安装SMAC3 uv add smac
这两种方法都会让GCC 13+以宽容模式处理旧版rapidjson的代码,绕过const成员赋值的编译错误。
2. 使用预编译wheel彻底避免编译
pyrfr 0.9.0及以上版本在PyPI上提供了适配Linux x86_64、Python 3.11的manylinux预编译wheel,你可以直接让uv优先使用二进制包,无需本地编译:
分步安装
# 强制使用pyrfr的预编译wheel uv add pyrfr==0.9.0 --only-binary pyrfr # 再安装SMAC3 uv add smac
一步到位
uv add smac --only-binary pyrfr
这样uv会自动下载对应架构和Python版本的预编译包,完全跳过编译环节,从根源上解决GCC版本兼容问题。
内容的提问来源于stack exchange,提问作者Couzin Emile
相关产品推荐
相关产品推荐

