macOS Big Sur下pyenv安装Python 3.9.1构建失败问题求助
我知道这类相关问题的反馈非常多,自去年我首次尝试安装Python 3.9.0起,就查阅了不少相关资料,也参考了多个同类型问题的讨论内容。
无论我设置什么样的环境变量,也不管是将XCode升级到最新的12.5版本,还是停留在12.3版本(HomeBrew包管理器提示该版本已过时),我都无法通过pyenv成功安装Python 3.9.1。
但另一方面,我已经通过Homebrew成功安装了Python 3.9.1和3.9.5,说明编译器本身是正常可用的。
我最近一次尝试时设置了如下环境变量:
export MACOSX_DEPLOYMENT_TARGET="$(sw_vers -productVersion | cut -c -5)" export LIBRARY_PATH="$(brew --prefix openssl)/lib:${LIBRARY_PATH}" export PYTHON_CONFIGURE_OPTS="--enable-framework" export PYTHON_CONFIGURE_OPTS="--with-openssl=$(brew --prefix openssl) ${PYTHON_CONFIGURE_OPTS}" export LDFLAGS="-L$(brew --prefix zlib)/lib -L$(brew --prefix bzip2)/lib" export CPPFLAGS="-I$(brew --prefix zlib)/include -I$(brew --prefix bzip2)/include" export CFLAGS="-I$(brew --prefix openssl)/include -I$(brew --prefix bzip2)/include -I$(brew --prefix zlib)/include -I$(brew --prefix readline)/include -I$(xcrun --show-sdk-path)/usr/include" export LDFLAGS="-L$(brew --prefix openssl)/lib -L$(brew --prefix readline)/lib -L$(brew --prefix zlib)/lib -L$(brew --prefix bzip2)/lib"
操作后始终报如下错误:
BUILD FAILED (OS X 11.4 using python-build 20180424) Inspect or clean up the working tree at /var/folders/c_/ll8fp86d39d2qthh_cbg8vlc0000gp/T/python-build.20210701193101.41835 Results logged to /var/folders/c_/ll8fp86d39d2qthh_cbg8vlc0000gp/T/python-build.20210701193101.41835.log Last 10 log lines: checking for python3.9... python3.9 checking for --enable-universalsdk... no checking for --with-universal-archs... no checking MACHDEP... "darwin" checking for gcc... gcc-10 checking whether the C compiler works... no configure: error: in `/var/folders/c_/ll8fp86d39d2qthh_cbg8vlc0000gp/T/python-build.20210701193101.41835/Python-3.9.1': configure: error: C compiler cannot create executables See `config.log' for more details make: *** No targets specified and no makefile found. Stop.
令我疑惑的是报错的最后一行和其他同类问题的反馈略有差异,另外“C compiler cannot create executables”的报错我之前以为是iTerm没有获得完整磁盘权限导致的,但排查后发现权限是正常的。
我不清楚报错中提到的target是什么,所以才尝试设置了上述环境变量,但并没有解决问题。部分站点提到需要手动执行make命令,我认为该步骤应该是pyenv自动执行的,而现在报错没有找到makefile,这又引出了新的问题点。
请问有没有人遇到过相同的问题,或者可以帮我排查一下问题原因?
问题更新
我刚刚发现执行pyenv which gcc时输出的路径是/usr/bin/gcc,按理来说应该使用CommandLine Tools或者HomeBrew安装的gcc,这会不会是问题的诱因?
1. 编译器路径冲突修复
你观察到的pyenv which gcc返回/usr/bin/gcc是核心诱因: macOS 自带的/usr/bin/gcc实际是clang的软链接,和构建日志中检测到的gcc-10不匹配,pyenv编译时校验编译器可用性失败,直接终止了后续配置流程,自然不会生成makefile,也就出现了后续的make报错。
执行以下命令临时指定编译使用的gcc、g++路径,可根据实际安装的gcc版本调整版本号:
export CC=gcc-10 export CXX=g++-10
如果希望永久生效,可将上述两行添加到shell配置文件(/.zshrc或/.bash_profile)中,执行source ~/.zshrc(zsh环境)或source ~/.bash_profile(bash环境)后生效。
2. 合并冗余环境变量
你当前设置的环境变量存在重复赋值问题,LDFLAGS被定义了两次,前一次配置会被直接覆盖,建议合并为统一配置:
export MACOSX_DEPLOYMENT_TARGET="$(sw_vers -productVersion | cut -c -5)" export LIBRARY_PATH="$(brew --prefix openssl)/lib:$(brew --prefix zlib)/lib:$(brew --prefix bzip2)/lib:$(brew --prefix readline)/lib:${LIBRARY_PATH}" export PYTHON_CONFIGURE_OPTS="--enable-framework --with-openssl=$(brew --prefix openssl)" export LDFLAGS="-L$(brew --prefix openssl)/lib -L$(brew --prefix readline)/lib -L$(brew --prefix zlib)/lib -L$(brew --prefix bzip2)/lib" export CPPFLAGS="-I$(brew --prefix zlib)/include -I$(brew --prefix bzip2)/include -I$(brew --prefix openssl)/include -I$(brew --prefix readline)/include -I$(xcrun --show-sdk-path)/usr/include" export CFLAGS="${CPPFLAGS}"
3. 重置Xcode命令行工具路径
Xcode命令行工具路径异常也会导致编译依赖查找失败,执行以下命令重置:
sudo xcode-select --reset
如果重置后仍有问题,可先卸载现有命令行工具再重新安装:
sudo rm -rf /Library/Developer/CommandLineTools xcode-select --install
4. 执行安装
完成上述配置后,先清理之前的失败构建缓存,再执行安装命令:
pyenv install --clean 3.9.1
内容的提问来源于stack exchange,提问作者Andrea Moro

