尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

在CMake项目中集成mimalloc内存分配器:编译静态库、链接测试程序并跑通分配统计

在CMake项目中集成mimalloc内存分配器:编译静态库、链接测试程序并跑通分配统计 在CMake项目中集成mimalloc内存分配器编译静态库、链接测试程序并跑通分配统计【免费下载链接】mimallocmimalloc is a compact general purpose allocator with excellent performance.项目地址: https://gitcode.com/GitHub_Trending/mi/mimalloc在 C/C 项目里用 mimalloc 替换系统默认的 malloc/free 时最快跑通的路线就是 CMake 官方构建本教程带你用 CMake 编译出 mimalloc 库写一个调用mi_malloc的测试程序完成链接最终看到真实的内存分配统计输出。准备工作安装CMake与编译器并克隆仓库mimalloc 的构建系统对版本有硬性要求根目录 CMakeLists.txt 第一行就是cmake_minimum_required(VERSION 3.18)版本低于 3.18 会直接报 configure 错误。依赖版本要求说明CMake≥ 3.18构建系统低于此版本无法生成构建目录C 编译器GCC / Clang / MSVC 均可仓库要求 C11、C17 标准Git任意较新版本用于克隆仓库不需要安装额外的第三方库Linux 下的pthread、rt、atomic等链接库由 CMakeLists.txt 里的find_link_library逻辑自动探测装好 CMake 和编译器即可。✅ 用cmake --version确认版本 ≥ 3.18然后克隆仓库git clone https://gitcode.com/GitHub_Trending/mi/mimalloc cd mimalloc进入仓库根目录后你应当能看到 include/mimalloc.h对外 API 头文件、src/库源码和 test/官方测试程序这几个关键路径。核心操作流程1. 生成构建目录并编译mimalloc库默认构建会同时产出三种产物共享库.so、静态库.a和单个对象文件.o由 CMakeLists.txt 中的MI_BUILD_SHARED、MI_BUILD_STATIC、MI_BUILD_OBJECT三个开关控制默认均为 ON。在仓库根目录执行mkdir -p out/release cd out/release cmake ../.. make配置阶段结束时CMake 会打印一段构建摘要确认这几行的含义-- Library name : mimalloc -- Build type : release -- Build targets : shared static object testsBuild targets一行出现shared static object三个词说明三类产物都会编译make结束后在out/release/下会看到libmimalloc.so、libmimalloc.a以及测试可执行文件mimalloc-test-api。2. 写一个调用mi_malloc的测试程序在任意目录新建demo.c完整内容如下不超过 10 行#include stdio.h #include mimalloc.h int main(void) { void* p mi_malloc(4096); // 用 mimalloc 分配 4KB mi_free(p); mi_stats_print(NULL); // 把分配统计打印到 stdout return 0; }其中mi_malloc/mi_free是对齐malloc/free语义的显式分配接口定义在 include/mimalloc.hmi_stats_print输出 mimalloc 内部维护的分配计数器是验证程序确实在用 mimalloc最直观的手段。3. 链接静态库并运行测试程序回到仓库根目录把out/release作为头文件目录和库目录直接编译运行gcc -Iinclude -o /tmp/demo /path/to/demo.c out/release/libmimalloc.a -lpthread /tmp/demo说明-Iinclude提供mimalloc.h链接的是刚编译出的静态库-lpthread是 mimalloc 在 Linux 上需要的线程库CMakeLists.txt 会自动为库本身链上它你的终端程序显式带上最稳妥。不想手写 gcc 命令的话也可以直接make test在构建目录里跑官方测试test/readme.md 说明了这套测试的用途。结果验证检查统计输出判断集成是否成功运行/tmp/demo后预期输出形如数值因平台而异字段名固定heap stats: peak total current block total# user: 4.0 KiB 4.0 KiB 0.0 KiB 4 KiB 1 internal: 0.0 KiB 0.0 KiB 0.0 KiB 0 KiB 0 small: 4.0 KiB 4.0 KiB 0.0 KiB 4 KiB 1 ... mimalloc stats: total: 4.0 KiB, reserved: 2.0 MiB, committed: 4.0 KiB判断标准只要看到user行出现 1 次 4 KiB 的分配记录、且末尾有mimalloc stats:汇总行就说明分配确实走了 mimalloc。失败时先查三处①make是否完整成功out/release下有没有libmimalloc.a② 编译命令里-I指向的include目录是否存在mimalloc.h③ 链接的是不是同一构建目录产出的库。官方还提供MIMALLOC_VERBOSE1环境变量加上它运行可看到 mimalloc 的初始化日志见 readme.md Using the Library 一节。避坑清单现象原因解法configure 阶段报CMake 3.18 or higher is required系统 CMake 版本过低不满足 CMakeLists.txt 的cmake_minimum_required升级 CMake 到 3.18或改用 contrib/vcpkg/ 提供的包管理器安装链接时报undefined reference to mi_malloc程序没有链上 mimalloc 库或头文件目录与库目录不匹配检查 gcc 命令里是否带了out/release/libmimalloc.a且-I指向仓库include目录运行直接 core dump / 断言失败Debug 库MI_DEBUG开启内部不变量检查更严暴露了程序本身的越界或 double free先用 Release 配置复现确认无误后按 readme.md 的 secure 构建方式-DMI_SECUREON启用防护页定位问题想验证全局 malloc 是否被替换但发现还是系统行为只调用mi_malloc不会影响程序里原有的malloc调用C 项目引入 include/mimalloc-new-delete.h 覆盖全局 new/delete或按 readme.md 用LD_PRELOAD加载libmimalloc.so做整体覆盖⚠️ 特别注意MIMALLOC_SHOW_STATS1环境变量只在Debug 构建中生效Release 库要靠代码里的mi_stats_print输出统计别在 Release 上干等退出打印。下一步想复用完整工程可以读 test/CMakeLists.txt——它演示了find_package(mimalloc)加静态库链接的完整写法C 项目建议再看一眼 include/mimalloc-new-delete.h在单个源文件里包含它就能接管全局分配器。性能数据方面官方基准图放在 doc/bench-2021/readme.md 的 Benchmark 一节有完整解读。【免费下载链接】mimallocmimalloc is a compact general purpose allocator with excellent performance.项目地址: https://gitcode.com/GitHub_Trending/mi/mimalloc创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表