如何将Assimp编译为/MT模式的静态库?运行时库不匹配问题求助
如何将Assimp编译为/MT模式的静态库?运行时库不匹配问题求助
我来帮你梳理下这个问题,你遇到的链接错误核心是Assimp编译时用了动态调试运行时库(MDd),但你的项目依赖静态调试运行时库(MTd),加上Bullet只能适配MT模式,所以必须把Assimp改成MT编译才行,别轻易放弃。
下面给你几个可行的解决方案,按优先级尝试:
1. 手动在CMakeGUI中指定运行时库参数
CMake默认会根据BUILD_SHARED_LIBS的状态自动匹配运行时库,但老版本的Assimp(比如你用的3.1.1)可能没正确适配这个逻辑,需要手动强制设置:
- 打开CMakeGUI,点击「Add Entry」按钮,依次添加以下4个变量:
- 变量名:
CMAKE_CXX_FLAGS_DEBUG,类型选STRING,值填/MTd - 变量名:
CMAKE_C_FLAGS_DEBUG,类型选STRING,值填/MTd - 变量名:
CMAKE_CXX_FLAGS_RELEASE,类型选STRING,值填/MT - 变量名:
CMAKE_C_FLAGS_RELEASE,类型选STRING,值填/MT
- 变量名:
- 添加完成后,先点击「Configure」,再点击「Generate」,最后重新编译整个Assimp解决方案。
2. 检查并修改Assimp的CMakeLists.txt
有些老项目的CMake脚本会硬编码运行时库参数,你可以打开assimp-3.1.1/CMakeLists.txt,搜索是否有直接设置/MD的代码:
- 如果找到类似
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /MD")的行,把它改成根据静态库开关判断的逻辑:
if(BUILD_SHARED_LIBS) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /MD") else() set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /MT") endif()
- 修改后,删除整个
build目录(避免缓存残留干扰),再重新用CMakeGUI配置编译。
3. 关于/FAILIFMISMATCH的说明
你看到的那些/FAILIFMISMATCH指令不是问题根源,它是Visual Studio编译器自动添加的,目的是防止不同运行时库的代码混合链接。只要你把Assimp编译成MTd模式,这些指令里的RuntimeLibrary=MDd_DynamicDebug自然会变成MTd_StaticDebug,不用手动修改它。
额外提醒
- 一定要清理旧的
build目录再重新配置,CMake的缓存经常会残留旧设置,导致新参数不生效。 - Assimp 3.1.1确实支持编译为MT模式的静态库,按上面的步骤来应该能搞定。
备注:内容来源于stack exchange,提问作者HolyCowOfDoom
相关产品推荐
相关产品推荐

