一.为什么需要构建 wheel
首先介绍一下为什么我在使用pip install命令安装这个库的时候它要构建wheel:
在使用 pip install mmcv
时,如果 pip
提示需要 Building wheel for mmcv,这是因为 pip
需要将该包的源码构建为二进制文件(即 wheel 文件),以便安装。以下是可能的原因和解释:
为什么需要构建 wheel?
-
没有预编译的 Wheel 文件
pip
首选安装已经编译好的 wheel 文件(扩展名为.whl
),因为它是已经构建好的二进制文件,安装速度更快。如果在 PyPI 上没有适合你系统和 Python 版本的预编译 wheel 文件,pip
会尝试从源码(通常是.tar.gz
或.zip
文件)构建 wheel。 -
平台或环境不兼容
某些库可能提供了部分平台的预编译 wheel,但你的环境(操作系统、Python 版本、架构)没有与其匹配的版本。因此,pip 会下载源码并尝试本地构建。 -
库依赖原生代码或 C 扩展
像mmcv
这样的库可能包含 C++/CUDA 等需要编译的扩展,因此需要构建本地 wheel。
为什么会导致构建 wheel 失败?
-
缺少依赖
构建 wheel 可能需要编译工具链(如 GCC、Clang)或特定的库依赖(如 CUDA、CuDNN),如果缺失这些依赖,或这些工具链使用时的设置错误,构建会失败 -
环境问题
- Python 版本可能不兼容。
- 缺少
setuptools
或wheel
工具包。你可以通过以下命令升级它们:pip install --upgrade pip setuptools wheel
如何解决?
-
安装预编译版本
如果可能,查找是否有匹配你环境的预编译版本:pip install mmcv
-
确保依赖满足
- Linux 系统安装编译工具链:
sudo apt update sudo apt install build-essential
- Windows 系统安装 Visual Studio C++ 工具包: 下载 Visual Studio。
- Linux 系统安装编译工具链:
总结
构建 wheel 通常是因为没有合适的预编译版本或你的环境需要本地编译。通过确保编译工具链和依赖齐全,或者直接安装预编译版本,可以解决这个问题。
==>. 什么是 Wheel?
Wheel 是 Python 中一种现代化的打包格式,文件扩展名为
.whl
。它是 Python 软件包的一种 二进制分发格式,旨在替代传统的setup.py
安装方式,使包的安装更快、更可靠。Wheel 的特点
预编译
- Wheel 文件包含了 Python 包的所有代码、资源文件以及(如果需要)预编译的二进制模块(如
.so
或.dll
文件)。- 这意味着安装时无需在本地进行编译,速度快且出错率低。
跨平台支持
- 有些 Wheel 文件是跨平台的(纯 Python 实现的包),但包含本地代码的包(如带 C/C++ 扩展的包)可能会针对特定平台和架构生成专用的 Wheel。
静态结构
- 与传统的
setup.py
动态构建不同,Wheel 文件是静态的,安装时无需运行setup.py
。Wheel 的优点
快速安装
- Wheel 文件是一个打包完成的分发格式,不需要编译,直接解压安装,速度比源码包(
tar.gz
或.zip
)快得多。减少依赖问题
- 如果包的二进制部分已经预编译,就不需要依赖本地的编译工具链(如 GCC 或 Visual Studio),减少安装复杂性。
统一标准
- Wheel 文件遵循 PEP 427 标准,便于工具链和社区广泛支持。
Wheel 的结构
一个
.whl
文件本质上是一个 ZIP 压缩文件,内部包括以下内容:
包的代码
包括.py
文件或已编译的二进制模块(如.so
或.dll
)。元数据
描述包的名称、版本、依赖关系等。可选资源文件
可能包括文档、配置文件、静态资源等。Wheel 与 Source 的区别
特性 Wheel(.whl) Source(源码,.tar.gz 或 .zip) 安装速度 快速 较慢(需要编译) 依赖工具 无需编译工具链 需要编译工具链(如 GCC、Make) 适用场景 用户端安装包 开发者端修改或调试代码 平台依赖 可能是平台特定的 通常是平台无关的(但需编译) 如何查看是否有 Wheel
使用
pip
检查:
运行以下命令可以查看包的分发格式:
pip install some-package --no-binary :all:
- 如果安装时需要编译,说明该包没有 Wheel 文件。
- 如果安装成功,说明包有预编译的 Wheel。
在 PyPI 网站查看:
PyPI · The Python Package Index 上可以查看包是否有适合你的平台和 Python 版本的 Wheel 文件。如何安装 Wheel 包
安装 Wheel 工具
如果你的环境中没有安装wheel
工具,可以先安装:
pip install wheel
从 PyPI 安装 Wheel
Wheel 是默认格式,不需要额外的参数:
pip install some-package
从本地安装 Wheel 文件
如果你已经下载了.whl
文件:
pip install some-package.whl
总结
- Wheel 是一种高效的 Python 包分发方式,极大地加快了安装速度,尤其适合有二进制依赖的库(如 NumPy、Pandas、MMCV 等)。
- 如果遇到需要手动编译的包,优先寻找预编译的 Wheel 文件,可以避免许多环境配置问题。
二.构建时遇到的问题:
可以看出,我遇到的问题,就是来自编译器g++的问题
进一步检查报错,发现错误原因为:
在编译过程中使用了 C++ 的新语法 if constexpr
,它需要 C++17 或更高的标准支持,但你的编译器默认未启用 -std=c++17
或 -std=gnu++17
。
以下是解决方案:
1. 确保你的编译器支持 C++17
运行以下命令检查你的编译器版本:
g++ --version
推荐版本:
- GCC 7.3 或更高(完全支持 C++17)
- 如果版本较低,建议更新 GCC:
2. 指定编译选项 -std=c++17
安装 mmcv
时,pip
会调用 setup.py
编译源代码。需要确保 CXXFLAGS
环境变量包含 -std=c++17
,如下设置:
CXXFLAGS="-std=c++17" pip install mmcv
如果使用 GPU 版(mmcv-full
),可以这样安装:
CXXFLAGS="-std=c++17" pip install mmcv-full -f https://download.openmmlab.com/mmcv/dist/cu118/torch2.0.0/index.html
总结
- 错误的核心原因是 C++17 支持未启用。
- 更新 GCC 和设置
CXXFLAGS="-std=c++17"
通常可以解决问题。 - 如果仍有问题,可以选择预编译的二进制包,避免手动编译的复杂性。