Godot 3.3 Mono版导出体积优化:带模块裁剪编译后生成Mono绑定报符号缺失错误求助
Godot 3.3 Mono 版本编译优化遇到符号缺失问题的解决方案
问题根因
该报错为编译产物的动态链接依赖与运行时环境不匹配,叠加模块裁剪时构建系统隐式特性被关闭导致:
- 编译时指定
mono_prefix=/opt/mono/使用自编译Mono依赖,但运行时动态链接器优先加载系统路径下的/lib64/libmonosgen-2.0.so.1,两者ABI不兼容,导致缺失的*_ZTIPi*(C++ RTTI的int*类型信息符号)无法被解析。 - 显式指定的
optimize=speed参数会调整链接裁剪规则,叠加大量模块关闭操作,导致Mono模块依赖的RTTI特性被构建系统自动关闭,对应符号未被正确导出。
修正后的编译流程与参数
1. 首次编译(生成Mono glue用临时二进制)
调整scons编译参数如下:
scons platform=x11 target=release_debug tools=yes optimize=size mono_glue=no mono_prefix=/opt/mono/ rpath=/opt/mono/lib use_rtti=yes use_exceptions=yes strip=yes module_gridmap_enabled=no module_jpg_enabled=no module_stb_vorbis_enabled=no module_tga_enabled=no module_tinyexr_enabled=no module_webp_enabled=no module_webm_enabled=no module_ogg_enabled=no module_opus_enabled=no module_vorbis_enabled=no -j3
参数调整说明:
- 替换
optimize=speed为optimize=size,符合体积优化目标,同时避免speed模式的过度链接裁剪 - 新增
rpath=/opt/mono/lib参数,强制运行时优先加载指定路径下的Mono库,避免加载系统Mono库 - 新增
use_rtti=yes use_exceptions=yes,显式开启Mono模块必需的C++ RTTI与异常特性 - 仅关闭资源类、明确不需要的模块,暂不关闭功能类模块,避免Mono绑定依赖的核心类型缺失
- 新增
strip=yes自动裁剪调试符号,直接减小二进制体积
2. 验证动态依赖
编译完成后运行ldd bin/godot.x11.opt.tools.64.mono,确认输出的libmonosgen-2.0.so.1路径指向/opt/mono/lib下,而非系统/lib64路径。
3. 生成Mono glue绑定
执行绑定生成命令,确认无报错:bin/godot.x11.opt.tools.64.mono --generate-mono-glue modules/mono/glue
4. 最终正式编译(导出用引擎二进制)
glue生成完成后,执行二次编译生成正式导出用引擎,本次去掉mono_glue=no参数,让构建系统自动打包已生成的绑定:
scons platform=x11 target=release tools=no optimize=size mono_prefix=/opt/mono/ rpath=/opt/mono/lib use_rtti=yes use_exceptions=yes strip=yes module_gridmap_enabled=no module_jpg_enabled=no module_stb_vorbis_enabled=no module_tga_enabled=no module_tinyexr_enabled=no module_webp_enabled=no module_webm_enabled=no module_ogg_enabled=no module_opus_enabled=no module_vorbis_enabled=no -j3
额外体积优化方案
- 导出游戏时开启Godot导出面板的“资源裁剪”、“PCK压缩”选项,排除未使用的资源
- 裁剪Mono运行时类库,移除项目未用到的.NET程序集,可减少导出体积10~30MB
- 若需进一步减小体积,可在编译Mono依赖时同步开启
optimize=size与LTO(链接时优化)特性
内容的提问来源于stack exchange,提问作者Luke
相关产品推荐
相关产品推荐

