mlpack 嵌入式交叉编译环境搭建:supported_boards 支持的架构清单与工具链配置指南
人工智能机器学习深度学习【免费下载链接】mlpackmlpack: a fast, header-only C machine learning library项目地址https://gitcode.com/gh_mirrors/ml/mlpack点击查看免费下载mlpack 是一个以效率为核心、header-only 设计的 C 机器学习库非常适合部署到嵌入式与低资源设备。本文基于仓库中的 supported_boards.md 文档系统梳理 mlpack 交叉编译环境的搭建流程、官方支持的全部ARCH_NAME架构清单以及每个架构对应的TOOLCHAIN_PREFIX与CMAKE_SYSROOT参数速查。读完本文你将能够在一台 x86_64 开发机上为 ARM、AArch64、RISC-V、x86、PowerPC、MIPS、SPARC 等目标平台交叉编译出可直接运行的 mlpack 静态二进制并掌握如何为新架构扩展支持。一、为什么需要交叉编译何时选择本机构建 vs 交叉构建mlpack 采用 CMake 驱动构建官方文档首先给出了一条判断准则如果目标设备自带功能完整的包管理器例如 Debian 系发行版的 apt并且设备内存足够如 RAM 大于 4GB那么可以直接在设备上编译 mlpack。否则就需要在一台性能更强的开发主机host上执行交叉编译再把产物拷贝到目标设备target上运行。以文档中的 crosscompile_armv7.md 为例Raspberry Pi 2 只有 1GB RAM操作系统本身可能已占用 250MB 甚至更多剩余可用内存仅约 750MB加上 ARMv7 单核 1GHz 的算力直接在 Pi 上编译不仅内存紧张而且耗时很长。此时把编译工作放到开发机上进行、再将静态链接的二进制传输到 Pi 上运行是更稳妥的工程方案。同时需要注意本指南的适用范围边界假设 host 与 target 具有兼容的 ABI且 host 侧运行着功能正常的操作系统Linux、macOS、Windows 均可目标是生成嵌入式 ABIeabi产物当前指南不支持 non-eabi 或裸机bare-metalC/C场景。二、两个核心 CMake 参数TOOLCHAIN_PREFIX与CMAKE_SYSROOT交叉编译工具链cross-compilation toolchain的搭建本身并不复杂。文档推荐使用 Bootlin 工具链也兼容其他工具链工具链就绪后只需为 mlpack 的 CMake 配置识别两个参数参数作用TOOLCHAIN_PREFIX指定调用工具链内编译器及其他工具时使用的前缀例如arm-buildroot-linux-gnueabihf-CMake 会在该前缀后拼接gcc、g、ld、gfortran、ar等工具名CMAKE_SYSROOT指定交叉编译环境的系统根目录system root在 Bootlin 工具链中即工具链目录下的sysroot/文件夹里面存放目标平台的标准库头文件与库文件这两个参数的底层逻辑可以在 CMake/crosscompile-toolchain.cmake 中看到具体实现set(CMAKE_SYSTEM_NAME Linux) set(CMAKE_SYSROOT) set(TOOLCHAIN_PREFIX CACHE STRING Path for toolchain for cross compiler and other compilation tools.) # 确保 CMake 在测试编译器时尝试构建静态库。 set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY) set(CMAKE_AR ${TOOLCHAIN_PREFIX}gcc-ar CACHE FILEPATH FORCE) set(CMAKE_C_COMPILER ${TOOLCHAIN_PREFIX}gcc) set(CMAKE_CXX_COMPILER ${TOOLCHAIN_PREFIX}g) set(CMAKE_LINKER ${TOOLCHAIN_PREFIX}ld) set(CMAKE_FORTRAN_COMPILER ${TOOLCHAIN_PREFIX}gfortran) set(CMAKE_ASM_COMPILER ${CMAKE_C_COMPILER}) set(CMAKE_OBJCOPY ${TOOLCHAIN_PREFIX}objcopy CACHE INTERNAL objcopy tool) set(CMAKE_SIZE_UTIL ${TOOLCHAIN_PREFIX}size CACHE INTERNAL size tool) set(CMAKE_FIND_ROOT_PATH ${CMAKE_SYSROOT}) set(CMAKE_EXE_LINKER_FLAGS ${CMAKE_EXE_LINKER_FLAGS} --sysroot${CMAKE_SYSROOT} CACHE INTERNAL FORCE) set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)可以从中总结出几个关键行为CMAKE_SYSTEM_NAME被固定为Linux即这套交叉编译流程面向 Linux 类目标系统C/C/Fortran/汇编编译器、链接器、归档工具全部由TOOLCHAIN_PREFIX拼接而来因此前缀必须与工具链内实际工具命名完全一致CMAKE_SYSROOT同时充当CMAKE_FIND_ROOT_PATH并且LIBRARY、INCLUDE、PACKAGE三种查找模式被限制为ONLY只从 sysroot 内找而PROGRAM模式为NEVER从而避免误用宿主机的头文件与库——这正是交叉编译正确性的关键链接器会通过--sysroot${CMAKE_SYSROOT}显式指向目标系统根目录。此外CMake/ConfigureCrossCompile.cmake 会在CMAKE_CROSSCOMPILING开启时强制校验这两个参数——任一缺失都会直接抛出FATAL_ERROR同时它还会编译一个最小的测试程序int main() { return 0; }来验证交叉编译器与 CXXFLAGS 组合是否可用失败时给出编译器输出便于排错。三、ARCH_NAME按目标架构选择优化与 OpenBLAS 配置除了上面两个参数mlpack 交叉编译还需要通过ARCH_NAME指定目标架构。它并不参与工具链查找而是驱动 CMake/crosscompile-arch-config.cmake 为当前架构注入以减小二进制体积为目标的编译优化标志并设置 OpenBLAS 的编译目标OPENBLAS_TARGET与字长OPENBLAS_BINARY32/64。该文件对所有平台统一施加了一组最小化体积标志例如set(CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} -Os -s -fdata-sections -ffunction-sections) set(CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} -fomit-frame-pointer -fno-unwind-tables) set(CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} -fno-asynchronous-unwind-tables -fvisibilityhidden) set(CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} -fshort-enums -finline-small-functions) set(CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} -findirect-inlining -fno-common) set(CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} -fmerge-all-constants -fno-ident) set(CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} -fno-unroll-loops -fno-math-errno) set(CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} -fno-stack-protector) set(CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} -flto) set(CMAKE_EXE_LINKER_FLAGS ${CMAKE_EXE_LINKER_FLAGS} -Wl,--hash-stylegnu -Wl,--build-idnone) set(CMAKE_EXE_LINKER_FLAGS ${CMAKE_EXE_LINKER_FLAGS} -Wl,-z,norelro) set(CMAKE_EXE_LINKER_FLAGS ${CMAKE_EXE_LINKER_FLAGS} -Wl,--gc-sections)这些标志-Os、--gc-sections、-flto链接时优化等共同服务于减小最终二进制体积这一目标对嵌入式部署至关重要。随后文件按ARCH_NAME的字母通过string(TOUPPER ...)大写化后逐个分支设置架构专属标志与 OpenBLAS 参数。文档还提示BOARD_NAME变量已废弃将在 mlpack 5 中移除请统一使用ARCH_NAME源码中仍保留了if (BOARD_NAME) set(ARCH_NAME ${BOARD_NAME})的兼容逻辑。四、支持的架构总览ARCH_NAME 速查表下表完整列出了 supported_boards.md 中登记的全部ARCH_NAME取值以及它们对应的工具链系列来自 Bootlin 工具链的目录命名和典型应用设备ARCH_NAME工具链系列Bootlin 目录典型应用设备ARM11armv6-eabihfARM11 系列如 ARM1176JZF-SCORTEXA7armv7-eabihfCortex-A7与RPI2共用配置CORTEXA8armv7-eabihfCortex-A8CORTEXA9armv7-eabihfCortex-A9CORTEXA15armv7-eabihfCortex-A15CORTEXA53aarch64Cortex-A53CORTEXA72aarch64Cortex-A72CORTEXA76aarch64Cortex-A76CORTEXA78aarch64Cortex-A78CORTEXA710aarch64Cortex-A710BCM2711aarch64Raspberry Pi 4BCM2711C906riscv64-lp64dT-Head XuanTie C906RISC-Vx280riscv64-lp64dSiFive Intelligence X280RISC-VKATAMIx86-i686Pentium III 级别 x86 设备COPPERMINEx86-i686Pentium IIICoppermineNORTHWOODx86-64Pentium 4NorthwoodPOWERPCG4powerpc-440fpPower Mac G4 Cube、BAE RAD750 等MIPS24Kmips32MIPS32 设备如 VoCore UltimateULTRASPARCsparc64UltraSPARC 工作站每个架构在 CMake/crosscompile-arch-config.cmake 中都对应一组专属的微架构标志-mcpu/-mtune/-march/-mfpu与 OpenBLAS 目标。例如ARM11使用-mtunearm1176jzf-s -mcpuarm1176jzf-s -mfloat-abihard -mfpuvfpOPENBLAS_TARGETARMV6、OPENBLAS_BINARY32CORTEXA7使用-mtunecortex-a7 -mfloat-abihard -mfpuneon-vfpv4OpenBLAS 目标为ARMV7注意文档中CORTEXA7与源码中的RPI2共用同一分支CORTEXA53/A72/A76/A78均附带-ftree-vectorize以利用 AArch64 的 NEON 自动向量化其中CORTEXA78因 OpenBLAS 尚无稳定的 A78 支持源码注释明确说明选取最接近的 CORTEXA76作为 OpenBLAS 目标BCM2711使用-marcharmv8.2-acryptofp16rcpcdotprodOpenBLAS 目标取CORTEXA72RISC-V 侧C906使用-mtunethead-c906、x280使用-mtunesifive-x280OpenBLAS 目标分别为RISCV64_GENERIC与x280传统 x86 侧KATAMI/COPPERMINE使用-marchpentium3NORTHWOOD使用-marchpentium4POWERPCG4使用-mcpuG4MIPS24K使用-march24kec两者均额外关闭了 OpenMPUSE_OPENMP0ULTRASPARC使用-mcpuultrasparcOPENBLAS_TARGETSPARC、OPENBLAS_BINARY64。这些标志说明ARCH_NAME不仅决定编译优化还直接影响 OpenBLAS 的交叉编译目标而 OpenBLAS 是 mlpack 线性代数核心 Armadillo 的默认后端因此选错ARCH_NAME会导致 OpenBLAS 无法正确为目标架构构建。五、通用交叉编译 CMake 命令模板确认好ARCH_NAME、TOOLCHAIN_PREFIX、CMAKE_SYSROOT三个取值后即可按下述模板执行配置务必把/path/to/bootlin/toolchain/替换为你系统上的真实工具链路径cmake \ -DBUILD_TESTSON \ -DARCH_NAME(Check the following table) \ -DCMAKE_CROSSCOMPILINGON \ -DCMAKE_TOOLCHAIN_FILE../CMake/crosscompile-toolchain.cmake \ -DTOOLCHAIN_PREFIX(Check the following table) \ -DCMAKE_SYSROOT(Check the following table) \ ../各参数说明BUILD_TESTSON同时构建测试可选编译耗时较长ARCH_NAME上表中的架构名驱动架构专属编译标志与 OpenBLAS 目标CMAKE_CROSSCOMPILINGON显式开启交叉编译模式。一旦开启CMakeLists.txt 中BUILD_SHARED_LIBS的默认值会变为OFF即默认生成静态库与静态二进制——这正是后续产物可以直接拷贝到目标设备运行的关键CMAKE_TOOLCHAIN_FILE指向仓库内的crosscompile-toolchain.cmake工具链描述文件TOOLCHAIN_PREFIX、CMAKE_SYSROOT见第二节。配置过程中由于交叉编译模式会触发 CMakeLists.txt 中的fetch_mlpack(ON)分支mlpack 的三大依赖——ensmallen 中的说明当CMAKE_CROSSCOMPILING被设置时OpenBLAS总会为目标架构重新编译OPENBLAS_TARGET/OPENBLAS_BINARY即由ARCH_NAME注入不会误用宿主机的 BLAS 库。六、各架构的TOOLCHAIN_PREFIX与CMAKE_SYSROOT完整取值下面按工具链系列分组完整列出 supported_boards.md 中登记的全部取值路径中的/path/to/bootlin/toolchain/需替换为实际解压位置。ARMv6-eabihfBootlin stable-2024.02-1ARM11-DTOOLCHAIN_PREFIX/path/to/bootlin/toolchain/armv6-eabihf--glibc--stable-2024.02-1/bin/arm-buildroot-linux-gnueabihf- -DCMAKE_SYSROOT/path/to/bootlin/toolchain/armv6-eabihf--glibc--stable-2024.02-1/arm-buildroot-linux-gnueabihf/sysrootARMv7-eabihfBootlin stable-2024.02-1以下四个 Cortex-A 架构均使用同一套armv7-eabihf工具链仅ARCH_NAME不同对应源码中不同的-mtune/-mfpu组合。CORTEXA7-DTOOLCHAIN_PREFIX/path/to/bootlin/toolchain/armv7-eabihf--glibc--stable-2024.02-1/bin/arm-buildroot-linux-gnueabihf- -DCMAKE_SYSROOT/path/to/bootlin/toolchain/armv7-eabihf--glibc--stable-2024.02-1/arm-buildroot-linux-gnueabihf/sysrootCORTEXA8-DTOOLCHAIN_PREFIX/path/to/bootlin/toolchain/armv7-eabihf--glibc--stable-2024.02-1/bin/arm-buildroot-linux-gnueabihf- -DCMAKE_SYSROOT/path/to/bootlin/toolchain/armv7-eabihf--glibc--stable-2024.02-1/arm-buildroot-linux-gnueabihf/sysrootCORTEXA9-DTOOLCHAIN_PREFIX/path/to/bootlin/toolchain/armv7-eabihf--glibc--stable-2024.02-1/bin/arm-buildroot-linux-gnueabihf- -DCMAKE_SYSROOT/path/to/bootlin/toolchain/armv7-eabihf--glibc--stable-2024.02-1/arm-buildroot-linux-gnueabihf/sysrootCORTEXA15-DTOOLCHAIN_PREFIX/path/to/bootlin/toolchain/armv7-eabihf--glibc--stable-2024.02-1/bin/arm-buildroot-linux-gnueabihf- -DCMAKE_SYSROOT/path/to/bootlin/toolchain/armv7-eabihf--glibc--stable-2024.02-1/arm-buildroot-linux-gnueabihf/sysroot提示源码中CORTEXA7与RPI2Raspberry Pi 2共用同一优化分支如果你要为树莓派 2 构建也可以直接使用-DARCH_NAMERPI2详见 crosscompile_armv7.md。AArch64Bootlin stable-2024.02-1CORTEXA53-DTOOLCHAIN_PREFIX/path/to/bootlin/toolchain/aarch64--glibc--stable-2024.02-1/bin/aarch64-buildroot-linux-gnueabihf- -DCMAKE_SYSROOT/path/to/bootlin/toolchain/aarch64--glibc--stable-2024.02-1/aarch64-buildroot-linux-gnueabihf/sysrootCORTEXA72-DTOOLCHAIN_PREFIX/path/to/bootlin/toolchain/aarch64--glibc--stable-2024.02-1/bin/aarch64-buildroot-linux-gnueabihf- -DCMAKE_SYSROOT/path/to/bootlin/toolchain/aarch64--glibc--stable-2024.02-1/aarch64-buildroot-linux-gnueabihf/sysrootCORTEXA76-DTOOLCHAIN_PREFIX/path/to/bootlin/toolchain/aarch64--glibc--stable-2024.02-1/bin/aarch64-buildroot-linux-gnu- -DCMAKE_SYSROOT/path/to/bootlin/toolchain/aarch64--glibc--stable-2024.02-1/aarch64-buildroot-linux-gnu/sysrootCORTEXA78-DTOOLCHAIN_PREFIX/path/to/bootlin/toolchain/aarch64--glibc--stable-2024.02-1/bin/aarch64-buildroot-linux-gnu- -DCMAKE_SYSROOT/path/to/bootlin/toolchain/aarch64--glibc--stable-2024.02-1/aarch64-buildroot-linux-gnu/sysrootCORTEXA710-DTOOLCHAIN_PREFIX/path/to/bootlin/toolchain/aarch64--glibc--stable-2024.02-1/bin/aarch64-buildroot-linux-gnu- -DCMAKE_SYSROOT/path/to/bootlin/toolchain/aarch64--glibc--stable-2024.02-1/aarch64-buildroot-linux-gnu/sysrootBCM2711Raspberry Pi 4-DTOOLCHAIN_PREFIX/path/to/bootlin/toolchain/aarch64--glibc--stable-2024.02-1/bin/aarch64-buildroot-linux-gnueabihf- -DCMAKE_SYSROOT/path/to/bootlin/toolchain/aarch64--glibc--stable-2024.02-1/aarch64-buildroot-linux-gnueabihf/sysrootRISC-V 64lp64dBootlin stable-2024.02-1C906-DTOOLCHAIN_PREFIX/path/to/bootlin/toolchain/riscv64-lp64d--glibc--stable-2024.02-1/bin/riscv64-buildroot-linux-gnueabihf- -DCMAKE_SYSROOT/path/to/bootlin/toolchain/riscv64-lp64d--glibc--stable-2024.02-1/riscv64-buildroot-linux-gnueabihf/sysrootx280-DTOOLCHAIN_PREFIX/path/to/bootlin/toolchain/riscv64-lp64d--glibc--stable-2024.02-1/bin/riscv64-buildroot-linux-gnueabihf- -DCMAKE_SYSROOT/path/to/bootlin/toolchain/riscv64-lp64d--glibc--stable-2024.02-1/riscv64-buildroot-linux-gnueabihf/sysrootx86 / x86-64Bootlin stable-2024.02-1KATAMI-DTOOLCHAIN_PREFIX/path/to/bootlin/toolchain/x86-i686--glibc--stable-2024.02-1/bin/x86-i686-buildroot-linux-gnueabihf- -DCMAKE_SYSROOT/path/to/bootlin/toolchain/x86-i686--glibc--stable-2024.02-1/x86-i686-buildroot-linux-gnueabihf/sysrootCOPPERMINE-DTOOLCHAIN_PREFIX/path/to/bootlin/toolchain/x86-i686--glibc--stable-2024.02-1/bin/x86-i686-buildroot-linux-gnueabihf- -DCMAKE_SYSROOT/path/to/bootlin/toolchain/x86-i686--glibc--stable-2024.02-1/x86-i686-buildroot-linux-gnueabihf/sysrootNORTHWOOD-DTOOLCHAIN_PREFIX/path/to/bootlin/toolchain/x86-64--glibc--stable-2024.02-1/bin/x86-64-buildroot-linux-gnueabihf- -DCMAKE_SYSROOT/path/to/bootlin/toolchain/x86-64--glibc--stable-2024.02-1/x86-64-buildroot-linux-gnueabihf/sysroot其他架构Bootlin stable-2024.02-1 / 2024.05-1POWERPCG4-DTOOLCHAIN_PREFIX/path/to/bootlin/toolchain/powerpc-440fp--glibc--stable-2024.02-1/bin/powerpc-buildroot-linux-gnu- -DCMAKE_SYSROOT/path/to/bootlin/toolchain/powerpc-440fp--glibc--stable-2024.02-1/powerpc-buildroot-linux-gnu/sysrootMIPS24K-DTOOLCHAIN_PREFIX/path/to/bootlin/toolchain/mips32--glibc--stable-2024.02-1/bin/mips32-buildroot-linux-gnu- -DCMAKE_SYSROOT/path/to/bootlin/toolchain/mips32--glibc--stable-2024.02-1/mips32-buildroot-linux-gnu/sysrootULTRASPARCBootlin stable-2024.05-1-DTOOLCHAIN_PREFIX/path/to/bootlin/toolchain/sparc64--glibc--stable-2024.05-1/bin/sparc64-buildroot-linux-gnu- -DCMAKE_SYSROOT/path/to/bootlin/toolchain/sparc64--glibc--stable-2024.05-1/sparc64-buildroot-linux-gnu/sysroot七、架构不在表中时就近选择或扩展支持如果目标架构没有出现在上述清单中文档给出了两条路径就近选择选用一个字长word size相近的已支持架构扩展支持直接在 CMake/crosscompile-arch-config.cmake 中适配参数——为新的ARCH_NAME分支补充CMAKE_CXX_FLAGS微架构优化标志、OPENBLAS_TARGET、OPENBLAS_BINARY等并欢迎通过 Pull Request 把新架构补充进官方表格。从源码结构看新增架构只需仿照现有分支添加elseif(ARCH STREQUAL NEWARCH)分支即可若想完全手动控制而不修改该文件也可以在配置时自行设置CMAKE_CXX_FLAGS、OPENBLAS_TARGET、OPENBLAS_BINARY并设置MANUAL_ARCHTRUE来绕过ARCH_NAME校验见crosscompile-arch-config.cmake末尾的message(FATAL_ERROR ...)分支逻辑。八、特殊平台注意事项ULTRASPARC 与非对齐内存访问文档对ULTRASPARC给出了一个专门的警告sparc64 指令集不支持非对齐加载unaligned loads因此如果要在该平台上执行图像操作必须在包含 mlpack 头文件之前添加#define STBIR_MEMCPY_NOUNALIGNED或者给编译器添加选项-DSTBIR_MEMCPY_NOUNALIGNED。#define STBIR_MEMCPY_NOUNALIGNED #include mlpack.hpp // 之后即可安全地在 SPARC 上使用 mlpack 的图像加载/保存功能或等价地在编译命令行中加入-DSTBIR_MEMCPY_NOUNALIGNEDmlpack 的图像加载/保存能力由捆绑的 STB 库提供相关选项详见 load_save.md 中的ImageOptions与各图像格式说明如 PNG、JPG、TGA、BMP 等而 STB 图像库在非对齐访问受限的平台上需要上述宏来规避未定义行为。这一提示同样适用于其他不支持非对齐访问的架构。九、端到端实战为 Raspberry Pi 交叉编译并运行 mlpack_knn配合仓库中的 crosscompile_armv7.md 教程可以完整走一遍下载工具链 → 交叉编译 → 传输运行的流程下载并解压工具链以 armv7-eabihf glibc 的 Bootlin 工具链为例wget下载 tar.bz2 后用tar -xvf解压即可工具链内含编译器与sysroot/标准库头文件目录获取 mlpack 源码并创建 build 目录执行 CMake 配置其中-DARCH_NAMERPI2或CORTEXA7并填写真实的TOOLCHAIN_PREFIX与CMAKE_SYSROOTCMake 会自动拉取依赖并为目标架构交叉编译 OpenBLAS编译make -jN编译全部程序或make mlpack_knn只编译 kNN 命令行程序验证产物用file bin/mlpack_knn检查应输出类似ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), statically linked, ... stripped的结果确认是面向 ARM 的静态二进制传输并运行通过scp将二进制拷贝到设备如scp .../bin/mlpack_knn 192.168.10.100:/home/pi/。由于交叉编译模式下默认静态链接产物无需在设备上安装任何共享库即可直接运行随后在设备上拉取数据集如covertype.csv.gz并用./mlpack_knn -v --k5 --reference_filecovertype.csv ...执行 kNN 搜索。十、将 mlpack 集成进自有嵌入式 CMake 项目如果不想直接构建 mlpack 的 CLI 程序而是把 mlpack 作为库嵌入到自己的嵌入式应用例如随机森林推理程序中仓库的 crosscompile_example.md 给出了标准做法在你的 CMake 项目中 includemlpack.cmake负责查找/下载依赖与ConfigureCrossCompile.cmake负责交叉编译配置然后调用fetch_mlpack(ON)一次性下载全部依赖并为目标架构交叉编译 OpenBLAS。之后按常规方式把MLPACK_INCLUDE_DIRS加入target_include_directories、把MLPACK_LIBRARIES静态模式下通常即 OpenBLAS加入target_link_libraries最后用与第五节相同的ARCH_NAME/TOOLCHAIN_PREFIX/CMAKE_SYSROOT参数执行 CMake 配置与make即可。这套流程与 mlpack 顶层构建共用同一套交叉编译基础设施——crosscompile-toolchain.cmake、crosscompile-arch-config.cmake 与 ConfigureCrossCompile.cmake 三者协作完成了工具链查找、架构优化、参数校验的完整闭环保证最终产物是针对目标嵌入式平台优化过的静态可执行文件。赞分享人工智能机器学习深度学习【免费下载链接】mlpackmlpack: a fast, header-only C machine learning library项目地址https://gitcode.com/gh_mirrors/ml/mlpack点击查看免费下载相关推荐终极指南如何从零构建嵌入式开发环境与交叉编译工具链实战终极指南如何从零构建嵌入式开发环境与交叉编译工具链实战 想要成为一名底层程序员或嵌入式系统工程师吗Low Level Programming Univers教程【免费下载】 飞腾交叉编译环境搭建之交叉编译工具链配置飞腾交叉编译环境搭建之交叉编译工具链配置 简介 本文档旨在指导开发者如何为飞腾处理器搭建高效的交叉编译环境特别聚焦于交叉编译工具链的配置。飞腾处理器以其在国产Rust嵌入式交叉编译工具cross环境变量配置指南Rust嵌入式交叉编译工具cross环境变量配置指南 前言 在嵌入式开发领域交叉编译是不可或缺的重要环节。rust embedded/cross项目为Rust开发工具构建工具上一篇Python Web PDB 教程下一篇微服务架构痛点终结者Istio服务网格如何解决传统框架5大难题创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

测试工程师转型AI数据治理:从缺陷猎人到数据架构师

测试工程师转型AI数据治理:从缺陷猎人到数据架构师

我刚做测试那几年,最上头的不是点按钮找 bug,而是盯着一套接口设计图想“这里到底谁能把它弄坏”。那种感觉就像追一部有瑕疵的侦探剧,提前锁定凶手。后来团队里一位做平台架构的同事半开玩笑说:你有这种“总想证明系统有罪”的毛…

2026/10/12 5:17:06 阅读更多 →
基于4A理念的运维安全管理平台架构设计与实践

基于4A理念的运维安全管理平台架构设计与实践

直接说结论:基于4A理念的运维安全管理平台,不是简单买一套堡垒机,而是要把账号、认证、授权、审计四个体系从架构层面统一建模,形成一个完整的技术闭环。我自己在金融、政务类项目里做过几套这样的平台,最深的感受是—…

2026/10/12 5:17:05 阅读更多 →
Zed官宣支持ACP:一次模型配置,全场景AI能力复用

Zed官宣支持ACP:一次模型配置,全场景AI能力复用

做原生 IDE 的人突然聊起 Agent 协议,这消息一出来,圈子里的讨论热度确实不低。很多朋友第一反应是:Zed 不是一直在打磨编辑器性能吗,怎么突然官宣 ACP 了?第二反应其实是更实际的问题——这东西跟我手上的工具链到底有…

2026/10/12 5:17:05 阅读更多 →

最新新闻

Tortoise-ORM 与 Sanic 集成实战:register_tortoise 生命周期管理全解析

Tortoise-ORM 与 Sanic 集成实战:register_tortoise 生命周期管理全解析

数据库后端 【免费下载链接】tortoise-orm Familiar asyncio ORM for python, built with relations in mind 项目地址: https://gitcode.com/gh_mirrors/to/tortoise-orm 点击查看 免费下载 本文以 Tortoise-ORM 仓库中 Sanic 集成示例 为主线,系统讲解…

2026/10/12 6:02:32 阅读更多 →
从ABP到Clean DDD:中后台系统架构迁移实践与反思

从ABP到Clean DDD:中后台系统架构迁移实践与反思

做中后台和SaaS类系统的团队,大概率都绕不开 ABP 这个名字。它把模块化、仓储模式、工作单元、动态 API、审计日志、多租户这些东西一次性打包成开箱即用的起点,用 .NET 技术栈做内部系统,几乎第一天就能跑起来。我所在的团队也是这样起步的&…

2026/10/12 6:02:32 阅读更多 →
STM32 | CLion + ST-Link下载调试完整流程

STM32 | CLion + ST-Link下载调试完整流程

一、下载程序 先创建一个文件夹: 命名:stlink.cfg 写入以下代码: # choose st-link/j-link/dap-link etc. #adapter driver cmsis-dap #transport select swdsource [find interface/stlink.cfg]transport select hla_swdsource [find target/stm32f4x.…

2026/10/12 6:02:32 阅读更多 →
Python代码打包成exe文件详解

Python代码打包成exe文件详解

一、pyhon代码打包成exe文件1-1:安装打包工具在PyCharm底部的 终端(Terminal) 里输入:pip install pyinstaller1-2:输入打包命令在同一个终端里输入(直接复制):pyinstaller --onefile --noconsole --hidden…

2026/10/12 6:02:32 阅读更多 →
知识工作插件化:从信息捕获到配置同步的效率体系

知识工作插件化:从信息捕获到配置同步的效率体系

平时做知识工作,最耗时间的往往不是思考本身,而是信息的搬运。你从网页摘一段话,粘贴进笔记里,格式全乱;你复制了一段关键论述,过了几天想找来源,翻遍聊天记录和文档都找不到;你给十…

2026/10/12 6:02:32 阅读更多 →
DJL与Spring集成:Java后端部署深度学习模型的实践指南

DJL与Spring集成:Java后端部署深度学习模型的实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 6:01:32 阅读更多 →

日新闻

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

在数码相机、高清显示屏与现代矢量图形技术高度发达的今天,画面可以做到绝对的锐利、平滑与无瑕。然而,当一张秋日手账插画或拍立得照片过于“平整无瑕”时,往往会散发出一种冰冷生硬的“数码塑料感(Digital Plasticity&#xff0…

2026/10/12 0:00:59 阅读更多 →
活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

在现代网页与移动端设计中,横排(Horizontal Layout)早已经成为了绝对的主流。然而,当我们翻开泛黄的线装古籍、宋版木刻诗集,或是欣赏一张茶道雅集的手写便签时,那种**自上而下纵向书写、自右向左逐列铺展&…

2026/10/12 0:00:59 阅读更多 →
周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

每到周日的晚上八点到十点,很多人心里都会悄悄亮起一盏警示灯。 在心理学上,这种现象有一个专门的称谓——“周日夜晚焦虑症(Sunday Scaries)”。明天又是周一,闹钟又要重新在七点响彻卧房;脑海里仿佛有一个…

2026/10/12 0:00:59 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/12 0:16:30 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/12 0:16:38 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/12 0:16:43 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 10:45:37 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 14:36:53 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 14:36:54 阅读更多 →