CMake项目集成mimalloc遇阻:无法生成override DLL且运行报错
解决方案
1. 修正CMake配置,生成并链接mimalloc-override
修改你的CMakeLists.txt,调整目标链接与核心配置:
cmake_minimum_required(VERSION 3.23) project(OpenGLPlayground2) set(CMAKE_CXX_STANDARD 20) set(SRC_DIR "${CMAKE_CURRENT_SOURCE_DIR}/src") set(RES_DIR "${CMAKE_CURRENT_SOURCE_DIR}/res") set(LIB_DIR "${CMAKE_CURRENT_SOURCE_DIR}/include") # 统一输出目录,避免DLL路径问题 set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin") add_executable(OpenGLPlayground2 src/main.cpp) set(MIMALLOC_DIR "${LIB_DIR}/mimalloc-master") # 开启override模式的核心配置 set(MI_OVERRIDE ON CACHE BOOL "Override default malloc" FORCE) set(MI_BUILD_SHARED ON CACHE BOOL "Build shared library" FORCE) set(MI_USE_CXX ON CACHE BOOL "Use C++" FORCE) add_subdirectory(${MIMALLOC_DIR}) # 链接override版本而非基础版本 target_link_libraries(${PROJECT_NAME} mimalloc-override) target_include_directories(${PROJECT_NAME} PRIVATE "${MIMALLOC_DIR}/include")
关键说明:
- 开启
MI_OVERRIDE后,mimalloc会自动构建mimalloc-override.dll,此时必须链接mimalloc-override目标,而非基础的mimalloc。 - 移除
MI_WIN_REDIRECT,该选项是手动重定向场景使用的,override模式下会由mimalloc内部自动处理。 - 统一运行时输出目录,可避免后续手动复制DLL的麻烦。
2. 解决运行时DLL缺失错误(0xC0000135)
上述CMake配置中已通过CMAKE_RUNTIME_OUTPUT_DIRECTORY将可执行文件和DLL统一输出到bin目录,生成项目后直接运行该目录下的程序即可。如果仍出现错误,可手动将生成的mimalloc-override.dll复制到可执行文件所在目录。
3. 验证override是否生效
修改main.cpp,验证mimalloc是否成功覆盖默认分配器:
#include <iostream> #include <cstdlib> #include "mimalloc.h" int main() { const char* version = mi_version(); std::cout << "mimalloc version: " << version << "\n"; void* ptr = malloc(1024); if (ptr != nullptr) { // 返回1说明内存由mimalloc分配,override生效 std::cout << "malloc uses mimalloc: " << mi_is_internally_allocated(ptr) << "\n"; free(ptr); } std::cout << "hi\n"; return 0; }
常见问题排查
- 若仍未生成
mimalloc-override.dll,检查mimalloc版本是否为最新,旧版本可能存在配置兼容问题。 - 查看CMake配置日志,确认
MI_OVERRIDE确实被设置为ON,避免配置未被正确读取。 - 确保Visual Studio的平台(x86/x64)与mimalloc编译平台一致,平台不匹配会导致DLL无法加载。
内容的提问来源于stack exchange,提问作者TasmanianNoob
相关产品推荐
相关产品推荐

