树莓派5 raspberry pi 5 8G 车辆识别开发环境部署 vulkan mnn 2
# Debian Sid 有独立 glslc 包(较新/不稳定) # glslang-tools 提供 glslangValidator 必须安装************** sudo apt install glslc glslang-tools
sudo apt install glslc glslang-tools opencl-headers ocl-icd-opencl-dev mesa-opencl-icd
不然出现下列错误
steven_roc@stevenroc-PCH:/opt/openAI/mnn/lib $ strings /opt/openAI/mnn/lib/libMNN.so | grep -i “spirv\|shader” | head -5
vkCreateShaderModule
vkDestroyShaderModule
VK_KHR_shader_float16_int8
Don’t find shader for %s
Create Vulkan Shader error: %d
# 2. 重新编译 MNN(步骤略)
cmake .. \
-DCMAKE_SYSTEM_NAME=Linux \
-DCMAKE_SYSTEM_PROCESSOR=aarch64 \
-DMNN_ARM82=ON \
-DMNN_OPENMP=ON \
-DMNN_VULKAN=ON \
-DMNN_OPENCL=ON \
-DMNN_OPENGL=OFF \
-DMNN_METAL=OFF \
-DMNN_CUDA=OFF \
-DMNN_BUILD_QUANTOOLS=OFF \
-DMNN_BUILD_BENCHMARK=ON \
-DMNN_BUILD_TEST=OFF \
-DMNN_BUILD_TOOLS=OFF \
-DMNN_BUILD_CONVERTER=OFF \
-DMNN_BUILD_DEMO=ON \
-DMNN_SEP_BUILD=ON \
-DCMAKE_BUILD_TYPE=Release \
-DCMAKE_CXX_STANDARD=17 \
-DMNN_USE_SYSTEM_LIB=ON \
-DMNN_BUILD_SHARED_LIBS=ON \
-DCMAKE_INSTALL_PREFIX=/opt/openAI/mnn
cmake -B build -S . \
-DCMAKE_BUILD_TYPE=Release \
-DCMAKE_CXX_STANDARD=17 \
-DMNN_ARM82=ON \
-DMNN_OPENMP=ON \
-DMNN_VULKAN=ON \
-DMNN_OPENCL=ON \
-DMNN_SEP_BUILD=OFF \
-DMNN_USE_SYSTEM_LIB=ON \
-DMNN_BUILD_SHARED_LIBS=ON \
-DMNN_CUDA=OFF \
-DMNN_BUILD_TEST=OFF \
-DMNN_BUILD_TOOLS=OFF \
-DCMAKE_INSTALL_PREFIX=/opt/openAI/mnn
sudo chown -R steven_roc:steven_roc /opt/openAI
权限:root
/usr/local/lib/
ls -lh /opt/openAI/project/MNN-3.5.0/build/source/backend/vulkan/libMNN_Vulkan.so
ls -lh /opt/openAI/project/MNN-3.5.0/build/source/backend/opencl/libMNN_CL.so
sudo cp /opt/openAI/project/MNN-3.5.0/build/source/backend/vulkan/libMNN_Vulkan.so /opt/openAI/mnn/lib/
sudo cp /opt/openAI/project/MNN-3.5.0/build/source/backend/opencl/libMNN_CL.so /opt/openAI/mnn/lib/
sudo cp /opt/openAI/project/MNN-3.5.0/build/source/backend/opencl/libMNN_CL.so /opt/openAI/mnn/lib/
sudo ldconfig# 4. 验证复制成功
ls -lh /opt/openAI/mnn/lib/14、环境变量配置建议(可选,推荐)
把 MNN 路径添加到你的 ~/.bashrc,方便以后编译其他程序:
echo 'export MNN_ROOT=/opt/openAI/mnn' >> ~/.bashrc echo 'export CPLUS_INCLUDE_PATH=/opt/openAI/mnn/include:$CPLUS_INCLUDE_PATH' >> ~/.bashrc echo 'export LD_LIBRARY_PATH=/opt/openAI/mnn/lib:$LD_LIBRARY_PATH' >> ~/.bashrc source ~/.bashrc
#!/bin/bash
set -e
# ==========================================
# MNN-3.5.0 树莓派5 优化版一键安装脚本
# 源码路径:/opt/openAI/project/MNN-3.5.0(已存在)
# 安装路径:/opt/openAI/mnn
# ==========================================
# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color
# 打印信息函数
print_info() {
echo -e "${GREEN}[INFO]${NC} $1"
}
print_warn() {
echo -e "${YELLOW}[WARN]${NC} $1"
}
print_error() {
echo -e "${RED}[ERROR]${NC} $1"
}
print_section() {
echo ""
echo "============================================="
echo -e "${GREEN}$1${NC}"
echo "============================================="
}
# ==========================================
# 1. 前置检查
# ==========================================
print_section "1. 前置检查"
# 检查是否为 root
if [ "$EUID" -eq 0 ]; then
print_error "请不要用 root 直接运行此脚本,请用普通用户 + sudo"
exit 1
fi
# 检查源码目录是否存在
MNN_SOURCE_DIR="/opt/openAI/project/MNN-3.5.0"
if [ ! -d "${MNN_SOURCE_DIR}" ]; then
print_error "源码目录不存在: ${MNN_SOURCE_DIR}"
exit 1
fi
print_info "✅ 源码目录确认: ${MNN_SOURCE_DIR}"
# 检查基础依赖
print_info "检查基础依赖..."
for cmd in git cmake make g++; do
if ! command -v $cmd &> /dev/null; then
print_error "缺少依赖: $cmd"
print_info "请先运行: sudo apt update && sudo apt install -y git cmake build-essential libvulkan-dev vulkan-tools mesa-vulkan-drivers mesa-opencl-icd ocl-icd-opencl-dev opencl-headers libopencv-dev"
exit 1
fi
done
print_info "✅ 基础依赖检查通过"
# ==========================================
# 2. 定义路径
# ==========================================
print_section "2. 路径配置"
MNN_INSTALL_DIR="/opt/openAI/mnn"
print_info "源码目录: ${MNN_SOURCE_DIR}"
print_info "安装目录: ${MNN_INSTALL_DIR}"
# ==========================================
# 3. 编译安装
# ==========================================
print_section "3. 编译安装 MNN-3.5.0"
cd ${MNN_SOURCE_DIR}
# 清理旧 build
print_info "清理旧的 build 目录..."
rm -rf build
mkdir -p build && cd build
# ==========================================
# CMake 配置(超详细参数说明) del -DMNN_BUILD_EXAMPLES=OFF \
# -DMNN_SEP_BUILD=ON 分离 libMNN_Vulkan.so /usr/local/lib/
# libMNN_CL.so /usr/local/lib/
# DMNN_SEP_BUILD=OFF 不分离
# # 👇 核心修复:关闭系统库,启用内置着色器打包
# 致命错误:-DMNN_USE_SYSTEM_LIB=ON, 强制 MNN 使用系统第三方库,直接关闭 MNN 内置 Vulkan 着色器的自动编译 + 打包功能
# ==========================================
print_info "运行 CMake 配置(树莓派5 专用优化参数)..."
cmake .. \
-DCMAKE_SYSTEM_NAME=Linux \
-DCMAKE_SYSTEM_PROCESSOR=aarch64 \
-DMNN_ARM82=ON \
-DMNN_OPENMP=ON \
-DMNN_VULKAN=ON \
-DMNN_OPENCL=ON \
-DMNN_OPENGL=OFF \
-DMNN_METAL=OFF \
-DMNN_CUDA=OFF \
-DMNN_BUILD_QUANTOOLS=OFF \
-DMNN_BUILD_BENCHMARK=ON \
-DMNN_BUILD_TEST=OFF \
-DMNN_BUILD_TOOLS=OFF \
-DMNN_BUILD_CONVERTER=OFF \
-DMNN_BUILD_DEMO=ON \
-DMNN_SEP_BUILD=ON \
-DCMAKE_BUILD_TYPE=Release \
-DCMAKE_CXX_STANDARD=17 \
-DMNN_USE_SYSTEM_LIB=OFF \
-DMNN_BUILD_SHARED_LIBS=ON \
-DCMAKE_INSTALL_PREFIX=/opt/openAI/mnn
# ==========================================
# 编译
# ==========================================
print_info "开始编译(树莓派5 4核全开,约15-20分钟)..."
make -j4
# ==========================================
# 安装
# ==========================================
print_info "安装到 ${MNN_INSTALL_DIR}..."
sudo make install
# ==========================================
# 4. 配置系统库路径
# ==========================================
print_section "4. 系统库路径配置"
print_info "添加 MNN 库路径到系统配置..."
echo "${MNN_INSTALL_DIR}/lib" | sudo tee /etc/ld.so.conf.d/mnn.conf
sudo ldconfig
print_info "✅ 系统库缓存已刷新"
# ==========================================
# 5. 验证安装
# ==========================================
print_section "5. 安装验证"
# 验证库文件
print_info "验证库文件..."
if [ -f "${MNN_INSTALL_DIR}/lib/libMNN.so" ]; then
print_info "✅ 核心库文件验证成功:"
ls -lh ${MNN_INSTALL_DIR}/lib/libMNN.so
# 如果是分离构建,也验证一下 Vulkan 库
if [ -f "${MNN_INSTALL_DIR}/lib/libMNN_Vulkan.so" ]; then
print_info "✅ Vulkan 后端库验证成功:"
ls -lh ${MNN_INSTALL_DIR}/lib/libMNN_Vulkan.so
fi
else
print_error "❌ 库文件验证失败"
exit 1
fi
# 验证系统能找到库
print_info "验证系统库缓存..."
if ldconfig -p | grep -q libMNN; then
print_info "✅ 系统库缓存验证成功:"
ldconfig -p | grep libMNN
else
print_error "❌ 系统库缓存验证失败"
exit 1
fi
# 验证头文件
print_info "验证头文件..."
if [ -f "${MNN_INSTALL_DIR}/include/MNN/Interpreter.hpp" ]; then
print_info "✅ 头文件验证成功"
else
print_error "❌ 头文件验证失败"
exit 1
fi
# ==========================================
# 6. 完成
# ==========================================
print_section "6. 安装完成"
echo ""
echo "============================================="
echo -e "${GREEN}🎉 MNN-3.5.0 安装成功!${NC}"
echo "============================================="
echo "📦 安装目录: ${MNN_INSTALL_DIR}"
echo "📁 头文件目录: ${MNN_INSTALL_DIR}/include"
echo "📚 库文件目录: ${MNN_INSTALL_DIR}/lib"
echo ""
echo "🔧 环境变量配置建议(添加到 ~/.bashrc):"
echo " export MNN_ROOT=${MNN_INSTALL_DIR}"
echo " export CPLUS_INCLUDE_PATH=${MNN_INSTALL_DIR}/include:\$CPLUS_INCLUDE_PATH"
echo " export LD_LIBRARY_PATH=${MNN_INSTALL_DIR}/lib:\$LD_LIBRARY_PATH"
echo ""
echo "📋 生成的库文件:"
if [ -d "${MNN_INSTALL_DIR}/lib" ]; then
ls -lh ${MNN_INSTALL_DIR}/lib/
fi
echo "============================================="
2、开启 MNN_SEP_BUILD=ON 时,Vulkan/OpenCL 后端会被编译成独立的动态库,但 MNN 官方的 CMakeLists.txt
没有给这两个后端库添加安装规则,所以 make install 只会复制核心的 libMNN.so,不会自动复制 libMNN_Vulkan.so 和 libMNN_CL.so
手动复制两个文件如下
# 13 开启 MNN_SEP_BUILD=ON 时,Vulkan/OpenCL 后端会被编译成独立的动态库,但 MNN 官方的 CMakeLists.txt #没有给这两个后端库添加安装规则,所以 make install 只会复制核心的 libMNN.so,不会自动复制 libMNN_Vulkan.so 和 libMNN_CL.so #手动复制两个文件如下 # 1. 先确认编译好的库文件存在 ls -lh /opt/openAI/project/MNN-3.5.0/build/source/backend/vulkan/libMNN_Vulkan.so ls -lh /opt/openAI/project/MNN-3.5.0/build/source/backend/opencl/libMNN_CL.so # 2. 复制到安装目录的 lib 文件夹 sudo cp /opt/openAI/project/MNN-3.5.0/build/source/backend/vulkan/libMNN_Vulkan.so /opt/openAI/mnn/lib/ sudo cp /opt/openAI/project/MNN-3.5.0/build/source/backend/opencl/libMNN_CL.so /opt/openAI/mnn/lib/ sudo cp /opt/openAI/project/MNN-3.5.0/build/source/backend/vulkan/libMNN_Vulkan.so /usr/local/lib/ sudo cp /opt/openAI/project/MNN-3.5.0/build/source/backend/opencl/libMNN_CL.so /usr/local/lib/ # 3. 刷新系统库缓存 sudo ldconfig # 4. 验证复制成功 ls -lh /opt/openAI/mnn/lib 权限:sudo chown -R steven_roc:steven_roc /opt/openAI sudo chown -R steven_roc:steven_roc /opt/openAI 权限:root /usr/local/lib/
3、环境变量配置建议(可选,推荐)
把 MNN 路径添加到你的 ~/.bashrc,方便以后编译其他程序:
echo 'export MNN_ROOT=/opt/openAI/mnn' >> ~/.bashrc echo 'export CPLUS_INCLUDE_PATH=/opt/openAI/mnn/include:$CPLUS_INCLUDE_PATH' >> ~/.bashrc echo 'export LD_LIBRARY_PATH=/opt/openAI/mnn/lib:$LD_LIBRARY_PATH' >> ~/.bashrc source ~/.bashrc
自适应IP