4、开发环境搭建:交叉编译工具链安装、Python虚拟环境配置、Ollama源码编译(针对ARM架构)、依赖库安装(CMake、Go、Protobuf)

好,咱们正式开始动手了。

这一章,说白了就是“把家伙事儿备齐”。你想想看,要在ARM板子上跑Ollama,总不能直接在板子上敲代码编译吧?那得等到天荒地老。我们的做法是——在强大的PC上交叉编译,生成ARM能跑的二进制文件,然后丢到板子上执行。

我个人习惯把开发环境分成四块:交叉编译工具链Python虚拟环境Ollama源码、以及三大依赖库(CMake、Go、Protobuf)。咱们一块一块来啃。

核心思路:在x86_64主机上,用交叉编译工具链生成ARM64架构的Ollama可执行文件。所有依赖库也必须编译成ARM版本。

4.1 交叉编译工具链安装

交叉编译工具链,就是一套能在PC上生成ARM机器码的编译器、链接器、库文件集合。我建议直接用ARM官方提供的GNU-A工具链,稳定且社区支持好。

安装步骤:

  1. 下载ARM64工具链(aarch64-linux-gnu):
    wget https://developer.arm.com/-/media/Files/downloads/gnu-a/10.3-2021.07/binrel/gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu.tar.xz
  2. 解压到指定目录:
    tar -xf gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu.tar.xz -C /opt/
  3. 添加环境变量:
    export PATH=/opt/gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu/bin:$PATH
  4. 验证安装:
    aarch64-none-linux-gnu-gcc --version

我的小经验:别用系统自带的gcc-multilib,那玩意儿坑多。我在项目中遇到过链接时符号找不到的问题,折腾了两天,换成ARM官方工具链后一次过。

4.2 Python虚拟环境配置

为什么要搞Python虚拟环境?因为Ollama的构建脚本和测试工具依赖Python,而且版本要求还挺严格。我建议用Python 3.10+,配合venv模块。

操作流程:

# 创建虚拟环境
python3 -m venv ollama-env

# 激活环境
source ollama-env/bin/activate

# 安装必要工具
pip install --upgrade pip setuptools wheel
pip install cmake ninja

嗯,这里要注意:虚拟环境一定要在项目根目录下创建,别乱放。我曾经把虚拟环境放在/tmp下,结果重启后全没了,那叫一个酸爽。

4.3 依赖库安装:CMake、Go、Protobuf

这三个家伙是Ollama编译的硬性依赖。咱们一个一个搞定。

4.3.1 CMake

CMake用于构建C++代码。ARM交叉编译需要指定工具链文件。

# 下载CMake 3.26+
wget https://github.com/Kitware/CMake/releases/download/v3.26.4/cmake-3.26.4-linux-x86_64.tar.gz
tar -xf cmake-3.26.4-linux-x86_64.tar.gz -C /opt/
export PATH=/opt/cmake-3.26.4-linux-x86_64/bin:$PATH

创建一个交叉编译工具链文件 arm-toolchain.cmake

set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR aarch64)
set(CMAKE_C_COMPILER aarch64-none-linux-gnu-gcc)
set(CMAKE_CXX_COMPILER aarch64-none-linux-gnu-g++)

4.3.2 Go语言环境

Ollama的核心代码是用Go写的。我们需要Go 1.22+,并且要支持交叉编译。

# 下载Go
wget https://go.dev/dl/go1.22.2.linux-amd64.tar.gz
tar -xf go1.22.2.linux-amd64.tar.gz -C /opt/
export PATH=/opt/go/bin:$PATH
export GOPATH=$HOME/go
export GOOS=linux
export GOARCH=arm64

避坑指南:我曾经忘记设置GOARCH=arm64,结果编译出来的还是x86_64的二进制,放到板子上直接报“Exec format error”。记住,交叉编译时GOOSGOARCH必须显式指定。

4.3.3 Protobuf

Protobuf用于序列化通信数据。Ollama内部用它做模型元数据的传输。

# 下载Protobuf源码
git clone https://github.com/protocolbuffers/protobuf.git
cd protobuf
git checkout v21.12

# 交叉编译
mkdir build_arm && cd build_arm
cmake .. \
  -DCMAKE_TOOLCHAIN_FILE=../arm-toolchain.cmake \
  -Dprotobuf_BUILD_TESTS=OFF \
  -DCMAKE_INSTALL_PREFIX=/opt/protobuf_arm
make -j$(nproc)
make install

4.4 Ollama源码编译(针对ARM架构)

终于到了重头戏。拉取Ollama源码,然后配置交叉编译参数。

# 克隆Ollama仓库
git clone https://github.com/ollama/ollama.git
cd ollama

# 设置交叉编译环境变量
export CC=aarch64-none-linux-gnu-gcc
export CXX=aarch64-none-linux-gnu-g++
export GOARCH=arm64
export CGO_ENABLED=1

# 编译
go build -o ollama_arm64 .

编译完成后,你会得到一个ollama_arm64文件。用file命令检查一下:

file ollama_arm64
# 输出:ollama_arm64: ELF 64-bit LSB executable, ARM aarch64, version 1 (SYSV), dynamically linked

看到“ARM aarch64”字样,说明交叉编译成功了。

我的经验:第一次编译时,我建议加上-v参数(go build -v),这样能看到每个包的编译过程。如果卡住了,能快速定位是哪个依赖出了问题。

4.5 知识体系总览

下面这张图,把整个开发环境搭建的脉络梳理清楚了。你可以把它当作“施工蓝图”。

开发环境搭建知识体系 x86_64 主机(开发机) Ubuntu 22.04 / macOS / WSL2 交叉编译工具链 ARM GCC 10.3 Go 1.22 (GOARCH=arm64) CMake + Protobuf Ollama 源码编译 go build -o ollama_arm64 CGO_ENABLED=1 交叉链接 ARM64 目标板(树莓派 / RK3588 / 飞腾) 部署 ollama_arm64 二进制 + 模型文件

4.6 验证与测试

环境搭好了,怎么确认没问题?我一般做三步验证:

  1. 工具链验证:写一个简单的Hello World,交叉编译后放到板子上跑。
  2. 依赖库验证:检查Protobuf和CMake能否正确识别ARM架构。
  3. Ollama验证:在板子上执行./ollama_arm64 --version,看能否正常输出。

注意:如果板子上缺少动态库(比如libstdc++.so.6),记得把工具链里的库文件拷贝过去。我曾经在RK3588板子上折腾了一下午,最后发现是libgcc_s.so.1版本不匹配。

好了,环境搭建这块就到这儿。工具链、虚拟环境、依赖库、Ollama源码编译,四步走完,你的开发环境就齐活了。接下来就可以愉快地编译和调试了。


专注资料整理