pip install dlib 编译失败因需本地编译C++扩展,依赖CMake和Boost编译期组件;推荐用conda install -c conda-forge dlib安装预编译版本。

为什么 pip install dlib 总是编译失败
dlib 是纯 C++ 实现的库,Python 的 dlib 包本质是用 pybind11 封装的 C++ 扩展模块,pip install dlib 默认会触发本地编译。Windows 上缺 CMake、没装 Visual Studio 构建工具、Boost 头文件路径不对,都会直接报错——比如 CMake Error: Could not find boost 或 LINK : fatal error LNK1181: cannot open input file 'libboost_python-vc142-mt-x64-1_75.lib'。Mac 和 Linux 也常卡在找不到 boost_python 编译目标。
必须手动配好 CMake 和 Boost 才能编译成功
不能跳过这步。dlib 的 setup.py 依赖 CMake 驱动构建流程,而 Boost 不是运行时依赖,是编译期依赖——它要提供 boost/python.hpp 和链接时需要的 libboost_python。常见错误包括:
- 只装了
boostPython 包(PyPI 上那个),但那是纯 Python 的假 Boost,完全没用 - CMake GUI 装了,但命令行
cmake不在 PATH,pip找不到 - Boost 编译出来的库名带版本号和编译器标识(如
-vc142-mt-x64-1_75),但 dlib 的CMakeLists.txt没配对上 - Windows 下用了 MinGW,但 dlib 官方只支持 MSVC
推荐方案:Windows 用 Visual Studio 2019/2022 + vcvarsall.bat 初始化环境;macOS 用 brew install cmake boost;Linux 用 apt install cmake libboost-python1.71-dev(注意版本号要匹配)。
绕过编译的最快方法:用 conda 安装预编译 wheel
如果只是想跑通代码,不是非得从源码改 dlib,优先走这条路。conda-forge 提供了各平台预编译好的 dlib,自带所有依赖,不碰 CMake 和 Boost:
立即学习“Python免费学习笔记(深入)”;
conda install -c conda-forge dlib
验证是否成功:
让 macOS 自动化像说话一样简单 —— 用代码控制你的 Mac,无需学习 AppleScript 系统要求 macOS 14+ (Sonoma) Python 3.9+ 需要开启:辅助功能 + 屏幕录制权限
python -c "import dlib; print(dlib.__version__)"
注意两点:
- 不要混用 pip 和 conda 管理同一个环境,尤其别在 conda 环境里 pip install dlib
- 某些旧版 conda(conda config --add channels conda-forge
非要源码编译?关键三步不能漏
确保以下三件事全部就位,再执行 python setup.py install 或 pip install .:
-
cmake命令全局可用(终端输cmake --version有输出) - Boost 已完整安装:头文件在
BOOST_ROOT/include/boost/,静态/动态库在BOOST_ROOT/lib/或BOOST_ROOT/stage/lib/,且库名与你的编译器、Python 版本一致(例如 Python 3.9 + MSVC 2019 → 要libboost_python-vc142-mt-x64-1_75.lib) - Windows 必须用对应版本的开发者命令行(如
Developer Command Prompt for VS 2022),否则cl.exe和link.exe不可见
如果仍报 Boost 找不到,可显式传参:
python setup.py install --set BOOST_ROOT="C:\local\boost_1_75_0" --set BOOST_LIBRARYDIR="C:\local\boost_1_75_0\lib64-msvc-14.3"
路径里的 lib64-msvc-14.3 是 bjam 编译后生成的实际目录名,不是固定写死的。
真正麻烦的从来不是“装不上”,而是编译出来的 dlib 在 import 时缺 DLL(Windows)或 dylib(macOS)——这些动态链接库路径没被系统识别,得手动加进 PATH 或 DYLD_LIBRARY_PATH。这点最容易被忽略,等跑起来才发现 ImportError: DLL load failed。

















