Clang64编译VCL项目运行报错BBOK资源找不到,Clang32运行正常
问题根因定位
- 错误提示中的
BBOK是VCL标准组件TBitBtn预定义的内置位图资源,对应Kind属性为bkOK的按钮位图,不需要你在项目代码里显式定义,所以你搜不到相关文件是正常的 - 64位静态编译时资源缺失的核心诱因是RAD Studio 10.4.2 Clang64编译器的资源链接器bug:静态链接时部分VCL内置资源没有被正确嵌入到64位PE文件的资源段中,32位编译器的资源链接逻辑没有这个问题,所以32位编译运行正常
- 启用 runtime packages 时报AV的问题是因为你本地64位运行时包的部署不完整,或者项目依赖的第三方组件没有正确编译64位运行时包版本,加载缺失的依赖包时触发访问违规
可行调试步骤
- 先用Resource Hacker打开64位静态编译生成的EXE文件,查看资源段的BITMAP分类,确认是否存在
BBOK对应的位图资源,验证资源缺失的判断 - 新建一个空白VCL Clang64项目,只拖一个Kind为bkOK的TBitBtn控件,用和你原项目完全一致的静态编译选项编译,运行测试,如果同样报错,就能确认是编译器环境的问题而非你项目代码的问题
- 临时把出错的OKBitBtn的Kind属性改为bkCustom,手动指定你自己导入的OK位图资源,测试64位静态编译是否能正常启动,排除其他潜在问题
解决方案
- 优先修复方案:打RAD Studio 10.4.2的最新补丁包
这个资源链接bug是10.4.2的已知问题,官方在后续的补丁更新中已经修复了Clang64静态链接时VCL内置资源缺失的问题,安装补丁后重新全量编译你的项目即可解决 - 临时规避方案:手动强制链接VCL资源单元
在你项目的主窗体代码的头文件或者实现文件顶部,添加如下代码强制链接VCL的按钮资源单元:
全量重新编译项目,强制编译器把VCL的标准控件资源嵌入到最终的EXE文件中#pragma link "Vcl.StdCtrls.Res" - 如果需要使用runtime packages的方案
先确认所有你项目用到的组件(包括第三方组件)都已经编译了64位的运行时包版本,然后把对应版本的bpl文件和你的EXE放在同一目录下部署,即可解决AV问题 - 兜底规避方案:替换所有TBitBtn为普通TButton
如果上述方案都无法落地,把项目中所有用到预定义Kind的TBitBtn替换为普通TButton,自定义按钮样式,即可绕过资源依赖问题
内容的提问来源于stack exchange,提问作者Roger Cigol
相关产品推荐
相关产品推荐

