Windows下使用CMake编译Assimp生成的.lib文件过大如何优化
Assimp Windows平台编译体积过大解决方案
1. 修正基础编译配置错误
你使用的是Visual Studio多配置生成器,CMAKE_BUILD_TYPE参数对这类生成器不生效,需要在编译阶段明确指定Release配置,避免编译出带调试信息的版本:
cmake --build . --config Release
你之前对比的Android平台12MB是动态库.so,而你当前BUILD_SHARED_LIBS设为OFF,编译的是静态.lib,静态库默认包含所有编译单元的完整符号、代码段,本身体积就远大于同功能的动态库,这是体积差的核心原因之一。如果可以接受动态链接,直接将BUILD_SHARED_LIBS设为ON,生成的dll体积会直接降到10~20MB区间。
2. 裁剪不需要的导入格式
从构建日志可以看到你开启了全部30+种格式的导入支持,这是静态库体积过大的最主要原因,你可以通过CMake参数禁用不需要的格式,仅保留实际用到的格式即可,示例配置:
# 禁用所有导入器默认开启规则 OPTION(ASSIMP_BUILD_ALL_IMPORTERS_BY_DEFAULT "Default value for all importers if not explicitly specified" OFF) # 仅开启需要的导入器,可根据自己的需求增删 OPTION(ASSIMP_BUILD_OBJ_IMPORTER "Build OBJ importer" ON) OPTION(ASSIMP_BUILD_GLTF_IMPORTER "Build GLTF importer" ON) OPTION(ASSIMP_BUILD_FBX_IMPORTER "Build FBX importer" ON)
仅保留3~5种常用格式的话,静态库体积可以直接下降70%以上。
3. 添加MSVC专属体积优化参数
你当前仅用了/Os优化,还需要补充编译、链接阶段的MSVC专属优化参数:
编译参数
- 添加
/GL:开启全程序优化 - 添加
/Gy:开启函数级链接,允许链接器裁剪未使用的函数 - 添加
/Gw:优化全局数据的链接裁剪 - 若不需要调试信息,可添加
/Zd仅保留最小调试信息,或直接删除/Zi//ZI参数完全关闭调试信息生成
链接参数
- 添加
/OPT:REF:裁剪未使用的函数和数据 - 添加
/OPT:ICF:合并完全相同的函数和数据 - 添加
/LTCG:开启链接时代码生成,和编译阶段的/GL配合使用
修改后的CMake命令参考:
mkdir build && cd build cmake -G "Visual Studio 16 2019" -A x64 ^ -DCMAKE_C_FLAGS_RELEASE="/MD /Os /GL /Gy /Gw" ^ -DCMAKE_CXX_FLAGS_RELEASE="/MD /EHsc /Os /GL /Gy /Gw" ^ -DCMAKE_EXE_LINKER_FLAGS_RELEASE="/OPT:REF /OPT:ICF /LTCG" ^ -DCMAKE_MODULE_LINKER_FLAGS_RELEASE="/OPT:REF /OPT:ICF /LTCG" ^ -DCMAKE_SHARED_LINKER_FLAGS_RELEASE="/OPT:REF /OPT:ICF /LTCG" ^ ..
4. 避免编译内置依赖
从构建日志可以看到Assimp没有找到系统zlib,自动编译了内置的zlib并嵌入到最终库中,你可以提前安装预编译的zlib,编译时指定ZLIB_ROOT参数指向zlib的安装路径,让Assimp链接外部的zlib动态库,减少自身库的体积。
此外可以开启ASSIMP_IGNORE_GIT_HASH参数,避免嵌入无用的git版本哈希信息。
内容的提问来源于stack exchange,提问作者hasdrubal
相关产品推荐
相关产品推荐

