
1. mmdeploy Windows 编译 example 的典型翻车现场如果你正在 Windows 上折腾 mmdeploy 的 example 编译大概率已经体会过那种「明明照着教程走CMake 就是不给面子」的崩溃感。mmdeploy 是 OpenMMLab 推出的模型部署工具箱能把 PyTorch 训练出来的检测、分类、分割模型转成 ONNX、TensorRT、OpenVINO 等推理后端可用的格式而 example 目录下的 C 推理程序则是验证部署链路是否真正跑通的关键一环。它适合谁适合已经跑通 Python 端推理、想进一步做 C SDK 集成、或者要给客户交付独立可执行文件的算法工程师和嵌入式方向开发者。问题在于Windows 下的编译环境和 Linux 差异极大。Linux 上一条apt install加cmake ..就能过的事情到了 Windows 就变成 CMake 找不到 OpenCV、找不到 ONNX Runtime、VS 版本对不上、DLL 版本错位等一连串连锁反应。我见过太多人卡在build_sdk.ps1执行后满屏红色报错或者好不容易编译出image_classification.exe双击一闪而过、命令行跑又没有任何输出。这篇记录聚焦一个核心场景在 Windows 上编译 mmdeploy example 时如何用一套统一的 Key/API 通道思路来整理本地编译环境把 CMake 配置、依赖路径、DLL 版本这三件事一次性理顺。所谓「统一 Key 通道」本质上是把模型转换、推理验证、远程调用这几个环节的凭证和地址收敛到一处管理避免环境变量到处散落导致排查困难。下面我会给出可复制的 CMake 片段、依赖检查命令和编译验证步骤帮你把坑一个个填平。2. TaoToken 统一 Key 通道在编译环境中的定位在动手改 CMake 之前先把「统一 Key 通道」这件事讲清楚否则后面环境变量一多你根本分不清哪个 Key 是给谁用的。mmdeploy 的完整链路通常包含三段模型转换Python 端 deploy.py、C SDK 编译CMake MSVC、推理验证example 可执行文件。这三段里模型转换和推理验证都可能涉及远程模型服务或云端推理接口的调用。如果你每个环节单独配一套地址和密钥环境变量会迅速膨胀成XXX_API_KEY、XXX_BASE_URL、XXX_TOKEN一大堆出问题时根本无从下手。TaoToken 在这里扮演的角色是提供一个统一的 API 入口把模型对话、编码辅助、密钥管理这些能力收敛到同一个 Base URL 下。你只需要记住一个地址https://taotoken.net/api配合一个 Key就能覆盖多个调用场景。对于 mmdeploy 这种需要反复验证模型输出、对比 Python 端和 C 端结果的流程来说统一通道能显著减少「这个 Key 是哪个服务的」这类低级排查成本。具体到编译环境我建议你这样组织用途配置项值统一 API 入口Base URLhttps://taotoken.net/api密钥管理API Key在控制台生成见下方链接模型标识Model ID按实际调用的模型填写编码辅助Coding Plan长期编码任务可选密钥的生成入口在控制台的 API Keys 页面地址是https://taotoken.net/console/api-keys?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewrite。生成后不要硬编码进脚本而是写进系统环境变量或者.env文件CMake 通过$ENV{}读取。需要强调的是TaoToken 不是编译工具链的一部分它不会参与 CMake 的链接过程。它的价值在于当你在编译 example 前后需要验证模型转换结果、对比推理输出、或者用编码助手排查 CMake 报错时有一个稳定的统一入口可用。把这件事想清楚后面配置 CMake 时就不会把「API 地址」和「依赖库路径」混为一谈。如果你只是想先验证模型能不能正常对话可以直接用模型对话页面https://taotoken.net/model-chat?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewrite快速试一下确认 Key 有效后再进入编译环节。3. 可复制的 CMake 配置片段与依赖路径整理这一节是全文的核心直接给你能粘贴的配置。先说结论mmdeploy example 编译失败八成以上是 CMake 找到的依赖路径不对尤其是 OpenCV 和 ONNX Runtime 这两个。3.1 先做依赖体检在改任何配置之前先用命令确认你的工具链版本。打开 PowerShell逐条执行cmake --version这里有个大坑如果你装过 Visual Studio 2019系统里可能存在两个 cmake一个是 VS 自带的路径在C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\Common7\IDE\CommonExtensions\Microsoft\CMake\CMake\bin另一个是你单独安装的C:\Program Files\CMake\bin。VS 自带的那个在编译 ppl.cv 时可能没问题但编译 mmdeploy example 时会出各种诡异错误。解决办法是把环境变量PATH里的 cmake 路径改成独立安装的版本然后重开终端确认where.exe cmake输出应该只有C:\Program Files\CMake\bin\cmake.exe这一条。如果还有 VS 自带的手动去「系统属性 → 环境变量」里把它删掉或下移。接着检查 OpenCVecho $env:OPENCV_DIR这个变量必须指向 OpenCV 的 build 目录比如D:\opencv\build而不是D:\opencv。很多人在这里少写一层CMake 就找不到OpenCVConfig.cmake。3.2 build_sdk.ps1 的关键修改mmdeploy 预编译包里的build_sdk.ps1需要改两处。第一处是$OPENCV_DIR第二处是 CMake 生成器。下面是我实测可用的片段$OPENCV_DIR D:/opencv/build $ONNXRUNTIME_DIR D:/mmdeploy/thirdparty/onnxruntime $CMAKE_EXE C:/Program Files/CMake/bin/cmake.exe $CMAKE_EXE -G Visual Studio 16 2019 -A x64 -DOpenCV_DIR$OPENCV_DIR -DONNXRUNTIME_DIR$ONNXRUNTIME_DIR -DMMDEPLOY_BUILD_SDKON -DMMDEPLOY_BUILD_EXAMPLESON -DMMDEPLOY_TARGET_BACKENDSort ..注意-G后面的生成器必须和你实际安装的 VS 版本一致。VS2019 用Visual Studio 16 2019VS2022 用Visual Studio 17 2022。写错了 CMake 会直接报找不到生成器。3.3 用 settings 片段固化环境为了避免每次开终端都要重新设环境变量我建议在项目根目录放一个settings.json风格的配置文件配合 PowerShell 的 profile 加载。下面是一个可复制的 JSON 片段{ env: { OPENCV_DIR: D:/opencv/build, ONNXRUNTIME_DIR: D:/mmdeploy/thirdparty/onnxruntime, MMDEPLOY_DIR: D:/mmdeploy, TAOTOKEN_BASE_URL: https://taotoken.net/api, TAOTOKEN_API_KEY: 你的Key, TAOTOKEN_MODEL_ID: 你的模型ID } }把TAOTOKEN_BASE_URL、TAOTOKEN_API_KEY、TAOTOKEN_MODEL_ID这三件套放在同一个文件里就是前面说的「统一 Key 通道」落地方式。CMake 本身不读这三个变量但你的验证脚本和编码辅助工具可以统一从这里取避免散落。如果你用的是 Cline MCP 或者 Claude Code 这类工具做编译排错配置里同样要写全三件套Base URL 填https://taotoken.net/apiKey 填控制台生成的Model ID 按实际模型填。缺任何一个都会导致调用失败。3.4 依赖路径的常见错位CMake 报Could NOT find OpenCV时先别急着改代码按这个顺序查OPENCV_DIR是否指向 build 目录、该目录下是否有OpenCVConfig.cmake、CMake 缓存是否残留旧路径。第三点最容易被忽略改完环境变量后一定要删掉build目录重新生成否则 CMakeCache.txt 里还是旧路径。ONNX Runtime 同理ONNXRUNTIME_DIR要指向包含include和lib的目录。预编译包里通常在thirdparty/onnxruntime确认这个目录下确实有lib/onnxruntime.dll和lib/onnxruntime.lib。4. 编译验证与成功结果确认配置改完进入验证环节。这一步的目标是确认 example 真的编译出来了而且能跑出结果。4.1 执行编译在 PowerShell 7 里依次执行.\set_env.ps1 .\build_sdk.ps1如果前面的 CMake 配置正确你会看到编译进度条一路推进最后在build/Release下生成一堆.exe包括image_classification.exe、object_detection.exe等。编译过程中如果报链接错误多半是 ONNX Runtime 的.lib没找到回去检查ONNXRUNTIME_DIR。4.2 运行验证编译完不要双击 exe那样窗口一闪而过什么都看不到。正确做法是 cd 到 Release 目录用命令行执行cd build\Release .\image_classification.exe ..\..\demo\demo.jpg这里有个细节在 cmd 里执行会明确告诉你缺哪个 DLL在 PowerShell 里则可能静默失败。所以排查 DLL 问题时优先用 cmd。mmdeploy example 通常只依赖四个 DLLonnxruntime.dll、opencv_world4xx.dll、mmdeploy.dll以及可能的cudart相关库。把这四个 DLL 和 exe 放在同一目录或者加入PATH。4.3 结果对比跑通后把 C SDK 的输出和 Python 端 onnxruntime 的输出对比一下。正常情况下类别应该一致分数可能有小幅差异这是浮点计算顺序不同导致的属于正常现象。如果类别都对不上那基本可以判定是 DLL 版本问题见下一节。如果你在验证阶段需要快速确认模型服务是否正常可以用模型对话入口https://taotoken.net/model-chat?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewrite做一次对照测试确认 Key 通道本身没问题把「模型服务问题」和「编译问题」区分开。5. 本篇常见报错逐条排查这一节按真实报错信息来你遇到哪条查哪条。报错一CMake Error找不到 OpenCVCould NOT find OpenCV (missing: OpenCV_DIR)原因几乎都是OPENCV_DIR指向了错误层级。解决确认路径末尾是build且该目录下有OpenCVConfig.cmake。改完删build目录重新生成。报错二local proxy failed 或连接超时这类报错通常出现在你用编码辅助工具排查问题时。检查TAOTOKEN_BASE_URL是否写成了https://taotoken.net/api注意不要多加斜杠或路径。如果用的是 Cline MCP确认 MCP 配置里的 Base URL、Key、Model ID 三件套齐全。报错三401 UnauthorizedKey 无效或未正确加载。检查环境变量TAOTOKEN_API_KEY是否为空或者配置文件里的 Key 是否有多余空格。重新在控制台生成一个 Key 再试。报错四reading choices 相关解析错误这通常出现在调用返回格式和预期不符时。确认 Model ID 填写正确不同模型返回结构可能不同。如果用的是 Codex 的auth.json方式检查文件里的字段名是否和文档一致。报错五OAuth 相关失败如果你用 Claude Code 接入OAuth 流程失败多半是回调地址或凭证配置问题。参考接入文档https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewrite重新走一遍授权流程。报错六exe 运行无输出、不报错这是最坑的一种对应原文里的「坑 5」。原因是thirdparty/onnxruntime/lib里自带的onnxruntime.dll版本和你 Python 端能跑通的版本不一致。解决去 ONNX Runtime 官方 release 页面下载对应版本替换掉虚拟环境和 thirdparty 目录里的 DLL。判断标准很简单——Python 端能出结果C 端不出就是 DLL 版本问题。报错七TensorRT 报找不到 CUDA转换模型时如果 device 没选cuda或者 TensorRT 版本和 CUDA 版本不匹配就会报这个。确认--device cuda参数带上且 TensorRT 的 whl 包和 CUDA 版本对应。报错八onnxruntime 版本过低导致转换失败mmdeploy 1.3.1 教程推荐onnxruntime1.8.1但实际转换时会报错。直接升级pip install onnxruntime --upgrade报错九mmdetection 装不上、mmcv 版本冲突这是环境层面的坑。torch 2.3.1 cu118 搭配的 mmcv 是 2.2.0但某些 mmdetection 版本不支持 mmcv 2.2.0。最稳的做法是新建虚拟环境按官方兼容表装conda create --name openmmlab python3.8 -y conda activate openmmlab conda install pytorch2.1.0 torchvision0.16.0 torchaudio2.1.0 pytorch-cuda11.8 -c pytorch -c nvidia pip install -U openmim mim install mmengine pip install mmcv2.1.0 -f https://download.openmmlab.com/mmcv/dist/cu118/torch2.1/index.html pip install mmdeploy1.3.1 pip install mmdeploy-runtime1.3.1 pip install onnxruntime这套组合实测能把 Faster-RCNN 正常导出不装 pycuda 也不影响 ONNX 和 TensorRT 转换。6. 把编译环境收敛成一套可复用的通道走到这里你应该已经能把 example 编译出来并跑出结果了。最后说几点经验性的东西帮你把这套环境固化下来下次换机器或者重装系统不用再踩一遍。第一环境变量集中管理。把OPENCV_DIR、ONNXRUNTIME_DIR、TAOTOKEN_BASE_URL、TAOTOKEN_API_KEY、TAOTOKEN_MODEL_ID全部写进一个配置文件用脚本加载。这样排查问题时只需要看一个文件不用在系统环境变量里翻来翻去。第二DLL 版本对齐。Python 端能跑通的 onnxruntime 版本就是 C 端应该用的版本。每次升级 Python 端依赖后记得同步替换 thirdparty 里的 DLL。这是「不报错但没结果」类问题的根因。第三虚拟环境隔离。mmdeploy、mmdetection、mmpretrain 这几个库的版本兼容关系很脆弱一个环境里塞太多东西迟早冲突。按任务新建环境虽然占点磁盘但省下的排查时间远超这点成本。第四统一 Key 通道的价值在长期。当你同时用模型对话验证输出、用编码辅助排查 CMake 报错、用 Coding Plan 做长期编码任务时一个 Base URL 加一个 Key 就能覆盖不用记多套凭证。密钥在控制台https://taotoken.net/console/api-keys?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewrite管理接入细节看文档https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewrite长期编码任务可以了解 Coding Planhttps://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewrite。编译这件事坑填平之后就是一条直线。把 CMake 路径、依赖目录、DLL 版本这三样管好Windows 下的 mmdeploy example 编译并没有想象中那么难。