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工具链,稳定且社区支持好。
安装步骤:
- 下载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 - 解压到指定目录:
tar -xf gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu.tar.xz -C /opt/ - 添加环境变量:
export PATH=/opt/gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu/bin:$PATH - 验证安装:
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”。记住,交叉编译时GOOS和GOARCH必须显式指定。
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 知识体系总览
下面这张图,把整个开发环境搭建的脉络梳理清楚了。你可以把它当作“施工蓝图”。
4.6 验证与测试
环境搭好了,怎么确认没问题?我一般做三步验证:
- 工具链验证:写一个简单的Hello World,交叉编译后放到板子上跑。
- 依赖库验证:检查Protobuf和CMake能否正确识别ARM架构。
- Ollama验证:在板子上执行
./ollama_arm64 --version,看能否正常输出。
注意:如果板子上缺少动态库(比如libstdc++.so.6),记得把工具链里的库文件拷贝过去。我曾经在RK3588板子上折腾了一下午,最后发现是libgcc_s.so.1版本不匹配。
好了,环境搭建这块就到这儿。工具链、虚拟环境、依赖库、Ollama源码编译,四步走完,你的开发环境就齐活了。接下来就可以愉快地编译和调试了。