1. 为什么我放弃了预编译包,转投 OpenClaw 源码编译
如果你正在搜索 OpenClaw 源码编译安装,大概率已经踩过预编译包的坑:官方 Release 里的二进制文件默认关掉了测试模块,想改一行推理调度逻辑却发现头文件根本没导出,或者你的机器是 ARM 架构而官方只给了 x86_64 的包。OpenClaw 是一个面向机器人控制与多模态任务编排的开源框架,它能做什么?简单说,它把感知、规划、执行三层抽象成可插拔的模块,适合需要在本地做二次开发、调试底层算子、或者把模型调用链路接进自己业务系统的开发者。适合谁?适合手里有 Linux/macOS 开发机、熟悉 CMake 基本语法、并且愿意花 30 分钟换一份完全可控构建产物的工程师。
我试过直接用官方 install 脚本,结果在 Ubuntu 22.04 上因为 Boost 版本冲突卡了一下午。后来改成源码编译,把BUILD_TESTS、ENABLE_LTO、CMAKE_INSTALL_PREFIX全部按需定制,反而一次跑通。这篇就按真实操作顺序,把 CMake 自定义配置、依赖管理、编译产物验证,以及编译完成后如何通过 TaoToken 统一 Key/API 通道完成模型调用配置,完整走一遍。你跟着敲命令即可,遇到报错直接跳到第 5 节对照排查。
先明确一个前提:OpenClaw 的源码编译不是「下载即用」,它依赖 CMake 3.15+、Python 3.8+、以及一组 C++ 数学库(Eigen、yaml-cpp、Boost、OpenSSL)。这些依赖在不同系统上的安装方式差异很大,所以第 3 节我会分平台给出可复制的配置片段。编译产物验证环节,我会用ctest跑单元测试,再用一个最小 Python 脚本调用编译好的openclaw_core,确认动态库能被正确加载。
还有一个容易被忽略的点:编译完成后,OpenClaw 默认的模型调用配置指向的是占位地址,你需要把它改成自己的 API 通道。这里我用 TaoToken 做统一入口,原因是它同时兼容 OpenAI 风格的/v1/chat/completions和 Anthropic 风格的/v1/messages,省得在多个 SDK 之间来回改 Base URL。具体配置在第 3 节的 JSON 片段里给出,你直接替换 Key 就能用。
2. 编译前把 TaoToken 的 Key 和通道准备好
在动手编译之前,先把模型调用通道准备好,这样编译完就能立刻验证功能,不用中途再回来折腾账号。TaoToken 在这里扮演的角色是「统一 Key/API 通道」:你只需要一个 API Key,就能在 OpenClaw 里调用不同厂商的模型,不用为每个模型单独维护一套鉴权逻辑。
第一步,打开模型对话页面确认你的 Key 可用。地址是 https://taotoken.net/api-keys ,登录后创建一个新 Key,复制保存。注意这个 Key 只在创建时完整显示一次,丢了就得重建。
第二步,确认你要用的模型 ID。OpenClaw 的配置文件里需要填model字段,常见的有claude-sonnet-4-20250514、gpt-4o这类。你可以在模型对话页面先手动发一条消息,确认模型能正常返回,再把模型 ID 抄进配置。
第三步,记下 Base URL。TaoToken 的 API 入口是 https://taotoken.net/api ,注意这里不加任何查询参数。OpenClaw 的 HTTP 客户端会在这个地址后面拼接/v1/chat/completions或/v1/messages,所以你在配置里只填到/api这一层。
如果你打算长期做编码类任务,比如让 OpenClaw 自动生成控制脚本、或者跑 Agent 循环,建议顺手看一下 Coding Plan 页面 https://taotoken.net/coding-plan ,它针对高频调用场景做了额度优化。普通调试用按量计费就够了,不用一上来就买套餐。
这里有个细节:OpenClaw 的源码编译产物默认读取~/.openclaw/config.json,但如果你用CMAKE_INSTALL_PREFIX改了安装路径,配置文件的位置也会跟着变。所以第 3 节我会把配置文件的绝对路径写清楚,你按自己的安装前缀调整。
另外,如果你在编译时启用了BUILD_TESTS=ON,部分测试用例会真实发起模型请求。这时候如果 Key 没配好,ctest会报 401。所以建议先把 Key 写进环境变量,再跑测试:
export TAOTOKEN_API_KEY="sk-你的Key" export TAOTOKEN_BASE_URL="https://taotoken.net/api"这样测试用例和运行时都从环境变量读取,不用把 Key 硬编码进源码。下面进入正式编译环节。
3. 可复制的 CMake 配置与依赖安装
这一节是全文的核心操作区。我会先给出一份完整的CMakeLists自定义配置片段,再分平台给出依赖安装命令,最后给出编译和安装命令。你按顺序执行即可。
3.1 依赖安装:Ubuntu / CentOS / macOS 三平台
Ubuntu 20.04+ 的依赖安装命令如下,注意libboost-all-dev体积较大,如果只需要核心功能可以换成libboost-system-dev libboost-filesystem-dev:
sudo apt update sudo apt install -y build-essential cmake git python3 python3-pip python3-venv python3-dev sudo apt install -y libeigen3-dev libyaml-cpp-dev libboost-all-dev libssl-devCentOS 8+ 需要先启用 EPEL 和 PowerTools,再装依赖。注意 CentOS 的 CMake 包名是cmake3,需要建软链接:
sudo yum install -y epel-release sudo yum groupinstall -y "Development Tools" sudo yum install -y cmake3 python3 python3-pip python3-devel git sudo yum install -y eigen3-devel yaml-cpp-devel boost-devel openssl-devel sudo alternatives --install /usr/local/bin/cmake cmake /usr/bin/cmake3 20macOS 用 Homebrew 最省事,Apple Silicon 机器注意 Homebrew 默认装在/opt/homebrew:
xcode-select --install brew install cmake git python@3.11 eigen yaml-cpp boost openssl依赖装完后,用cmake --version、python3 --version、gcc --version各验证一次。版本不达标就别往下走,否则 CMake 配置阶段会直接报错。
3.2 源码获取与虚拟环境
克隆仓库并切到稳定分支。如果你要改源码,建议 fork 后克隆自己的仓库,再把上游加为 remote:
git clone https://github.com/openclaw/openclaw.git cd openclaw git checkout develop git describe --tags创建 Python 虚拟环境并安装依赖。这一步不能省,因为 OpenClaw 的 Python 绑定依赖特定版本的pybind11:
python3 -m venv venv source venv/bin/activate pip install --upgrade pip pip install -r requirements.txt3.3 CMake 自定义配置片段
下面是重点。我给出一个CMakePresets.json风格的配置片段,你可以直接存成CMakePresets.json放在项目根目录,也可以用-D参数逐条传。先看 JSON 版本,路径和原文一致:
{ "version": 3, "configurePresets": [ { "name": "dev-debug", "displayName": "Developer Debug Build", "generator": "Unix Makefiles", "binaryDir": "${sourceDir}/build/debug", "cacheVariables": { "CMAKE_BUILD_TYPE": "Debug", "CMAKE_INSTALL_PREFIX": "/usr/local/openclaw", "BUILD_TESTS": "ON", "BUILD_EXAMPLES": "ON", "ENABLE_OPTIMIZATIONS": "OFF", "ENABLE_DEBUG_SYMBOLS": "ON", "CMAKE_CXX_STANDARD": "17", "CMAKE_EXPORT_COMPILE_COMMANDS": "ON" } }, { "name": "release-lto", "displayName": "Release with LTO", "generator": "Unix Makefiles", "binaryDir": "${sourceDir}/build/release", "cacheVariables": { "CMAKE_BUILD_TYPE": "Release", "CMAKE_INSTALL_PREFIX": "/usr/local/openclaw", "BUILD_TESTS": "OFF", "BUILD_EXAMPLES": "OFF", "ENABLE_OPTIMIZATIONS": "ON", "ENABLE_LTO": "ON", "OPTIMIZATION_LEVEL": "3" } } ] }如果你不想用 preset,直接命令行传参也行。下面这条命令等价于dev-debugpreset:
mkdir -p build/debug && cd build/debug cmake ../.. \ -DCMAKE_BUILD_TYPE=Debug \ -DCMAKE_INSTALL_PREFIX=/usr/local/openclaw \ -DBUILD_TESTS=ON \ -DBUILD_EXAMPLES=ON \ -DENABLE_OPTIMIZATIONS=OFF \ -DENABLE_DEBUG_SYMBOLS=ON \ -DCMAKE_CXX_STANDARD=17 \ -DCMAKE_EXPORT_COMPILE_COMMANDS=ON几个参数的实际作用:CMAKE_EXPORT_COMPILE_COMMANDS=ON会生成compile_commands.json,配合 clangd 或 VSCode C++ 插件能实现精准跳转;ENABLE_DEBUG_SYMBOLS=ON让 GDB 能打印变量名;ENABLE_LTO=ON会显著增加链接时间,但运行时性能提升在 5% 到 12% 之间,按需开启。
3.4 编译与安装
配置成功后,用--parallel并行编译。核数按你机器的实际核心数填,别盲目开满,否则内存不够会 OOM:
cmake --build . --config Debug --parallel 8 cmake --install . --config Debug安装完成后,检查产物目录:
ls -la /usr/local/openclaw/bin ls -la /usr/local/openclaw/lib你应该能看到openclaw可执行文件和libopenclaw_core.so(macOS 是.dylib)。如果lib目录为空,说明CMAKE_INSTALL_LIBDIR被系统默认值覆盖了,回到 CMake 配置阶段显式加-DCMAKE_INSTALL_LIBDIR=lib重新配置。
3.5 模型调用配置:settings 片段
编译完成后,把 TaoToken 的通道写进 OpenClaw 的配置文件。默认路径是~/.openclaw/config.json,如果你改了安装前缀,路径是/usr/local/openclaw/etc/openclaw/config.json。内容如下:
{ "model_provider": { "base_url": "https://taotoken.net/api", "api_key_env": "TAOTOKEN_API_KEY", "default_model": "claude-sonnet-4-20250514", "timeout_seconds": 60, "max_retries": 3 }, "runtime": { "log_level": "info", "plugin_dir": "/usr/local/openclaw/lib/plugins" } }注意api_key_env字段,它让 OpenClaw 从环境变量读取 Key,而不是把 Key 明文写进配置文件。这样你可以在 CI 里注入不同的 Key,本地开发用另一个。配置写完后,用openclaw --check-config验证语法,返回config OK即可。
4. 验证编译产物与模型调用是否真的通了
编译成功不等于能跑。这一节做两层验证:先跑单元测试确认核心库没问题,再用一个最小脚本确认模型调用链路通了。
4.1 运行 ctest 单元测试
如果你配置时开了BUILD_TESTS=ON,进入构建目录跑测试:
cd build/debug ctest --output-on-failure --parallel 4正常输出会显示每个测试用例的通过状态,最后一行是100% tests passed。如果某个用例失败,用ctest -R 用例名 --verbose单独跑,看详细日志。常见的失败原因是LD_LIBRARY_PATH没包含安装目录的lib,临时加上即可:
export LD_LIBRARY_PATH=/usr/local/openclaw/lib:$LD_LIBRARY_PATH4.2 验证动态库加载
用ldd检查可执行文件的依赖是否都能解析:
ldd /usr/local/openclaw/bin/openclaw | grep "not found"如果输出为空,说明所有依赖都找到了。如果有not found,对照缺失的库名回到第 3.1 节补装。
4.3 最小模型调用验证
写一个 Python 脚本,调用编译好的openclaw_core模块,并通过 TaoToken 通道发一条测试消息:
import os import openclaw_core os.environ["TAOTOKEN_API_KEY"] = "sk-你的Key" client = openclaw_core.Client( base_url="https://taotoken.net/api", model="claude-sonnet-4-20250514" ) resp = client.chat("用一句话说明 OpenClaw 的核心用途") print(resp.text)运行后如果打印出模型返回的文本,说明编译产物、动态库加载、模型调用三层全部打通。如果报ModuleNotFoundError,说明 Python 绑定没装进虚拟环境,回到项目根目录执行pip install -e .重新安装。
4.4 验证自定义编译选项是否生效
如果你开了ENABLE_LTO=ON,可以用nm检查符号是否被内联优化掉:
nm -C /usr/local/openclaw/lib/libopenclaw_core.so | grep "openclaw::core::plan" | headLTO 开启后,部分内部符号会消失,这是正常现象。如果你开了ENABLE_DEBUG_SYMBOLS=ON,用file命令确认:
file /usr/local/openclaw/lib/libopenclaw_core.so输出里应该包含with debug_info。没有的话,检查 CMake 配置阶段是否真的传了-DENABLE_DEBUG_SYMBOLS=ON,有时候缓存会导致旧配置残留,删掉build目录重新配置即可。
5. 编译与接入过程中的真实报错排查
这一节按报错原文对照,你遇到哪条直接跳哪条。
5.1 CMake 配置阶段报Could NOT find Boost
完整报错通常是Could NOT find Boost (missing: system filesystem)。原因是 Boost 装了但 CMake 没找到。解决办法是显式指定 Boost 根目录:
cmake .. -DBOOST_ROOT=/usr/local -DBoost_NO_SYSTEM_PATHS=ONmacOS 上用 Homebrew 装的 Boost 路径是/opt/homebrew/opt/boost,对应改成-DBOOST_ROOT=/opt/homebrew/opt/boost。
5.2 编译阶段报undefined reference to yaml-cpp
这是链接顺序问题。CMake 默认把yaml-cpp放在依赖列表末尾,但某些 GCC 版本要求被依赖库放在后面。解决办法是在CMakeLists.txt里把target_link_libraries的顺序调整,或者临时用单线程编译确认不是并行导致的:
cmake --build . --parallel 1如果单线程能过,说明是并行编译的依赖顺序问题,加-DCMAKE_LINK_DEPENDS_NO_SHARED=ON重新配置。
5.3 运行时报error while loading shared libraries: libopenclaw_core.so
这是LD_LIBRARY_PATH没配。永久解决方法是写进/etc/ld.so.conf.d/openclaw.conf:
echo "/usr/local/openclaw/lib" | sudo tee /etc/ld.so.conf.d/openclaw.conf sudo ldconfigmacOS 上用DYLD_LIBRARY_PATH,或者用install_name_tool改 rpath。
5.4 模型调用报401 Unauthorized
这是 Key 没传对。检查三件事:环境变量TAOTOKEN_API_KEY是否在当前 shell 生效(echo $TAOTOKEN_API_KEY);配置文件里的api_key_env字段名是否和实际环境变量名一致;Base URL 是否写成了https://taotoken.net/api/v1(多写了/v1会导致路径拼接错误)。正确写法是只写到/api。
5.5 报local proxy failed或连接超时
这个报错通常出现在公司内网环境,说明 HTTP 客户端走了系统代理但代理不可达。检查http_proxy和https_proxy环境变量,临时清掉再试:
unset http_proxy https_proxy如果清掉后能通,说明是代理配置问题,不是 OpenClaw 本身的问题。
5.6 报reading choices解析失败
完整报错类似json: cannot unmarshal object into Go struct field .choices。这是模型返回格式和 OpenClaw 预期不一致。检查你用的模型 ID 是否支持 OpenAI 兼容格式。如果用的是 Anthropic 风格模型,确认 OpenClaw 版本是否支持/v1/messages路径。升级到最新 develop 分支通常能解决。
5.7 OAuth 相关报错
如果你在配置里启用了 OAuth 模式,报OAuth token expired时,重新走一遍授权流程即可。OpenClaw 的 OAuth 缓存默认在~/.openclaw/oauth.json,删掉这个文件会强制重新授权。
6. 编译完成后怎么把 OpenClaw 接进你的开发流
走到这里,你已经有了一个完全自定义的 OpenClaw 构建产物。接下来把它接进日常开发流,才算真正发挥源码编译的价值。
第一件事,把compile_commands.json软链到项目根目录,让 clangd 能索引:
ln -s build/debug/compile_commands.json compile_commands.json第二件事,如果你要长期跑 Agent 任务,建议把模型调用通道固定到 Coding Plan,地址是 https://taotoken.net/coding-plan ,它针对高频调用做了额度优化,比按量计费更划算。普通调试继续用按量计费即可。
第三件事,把编译和测试命令写进Makefile或justfile,避免每次手敲一长串 CMake 参数。例如:
build-debug: cmake --build build/debug --parallel 8 test: cd build/debug && ctest --output-on-failure --parallel 4 install: cmake --install build/debug第四件事,如果你改了源码,记得在提交前跑一遍ctest,确保没有破坏核心功能。OpenClaw 的测试覆盖率在核心模块上大约 70%,改推理调度逻辑时尤其要跑test_planner和test_executor两个用例。
最后,如果你在编译过程中遇到本文没覆盖的报错,可以去接入文档页面 https://taotoken.net/doc 查模型调用相关的配置说明,或者直接在模型对话页面 https://taotoken.net/chat 发一条消息确认通道本身是否正常。编译产物验证通过后,你就可以在openclaw_core的基础上写自己的插件了。