编译EDK2时如何禁用-Werror?兼结构体编译错误排查
解决EDK2 EmulatorPkg编译中的-Werror禁用及CHAR16指针错误12288问题
一、禁用-Werror的几种方法
新版EDK2已移除Nt32Pkg,替换为EmulatorPkg,工具链配置逻辑也有更新,你可以通过以下方式关闭-Werror:
编译命令行参数
执行build命令时直接添加宏定义:build -a X64 -t VS2019 -p EmulatorPkg/EmulatorPkg.dsc -D NO_WERROR=TRUE该宏会让EDK2构建系统自动移除MSVC的
/Werror编译选项。修改EmulatorPkg.dsc文件
在Dsc文件的[Defines]段添加:DEFINES += NO_WERROR=TRUE这样每次编译该Pkg时都会自动禁用警告转错误的规则。
调整tools_def.txt配置
找到Conf/tools_def.txt中对应VS2019的工具链条目(如MSVC:*_VS2019_*),定位包含/Werror的编译FLAGS行,直接删除/Werror字段。注意不同架构(X64/IA32)的条目可能需要分别修改。
二、CHAR16指针错误12288的原因及修复
错误12288对应MSVC的C4228警告被升级为错误,触发场景是:
- 结构体中使用了非
CONST的CHAR16*成员,却用字符串字面量(如L"xxx")初始化它。 - 字符串字面量在C++标准中属于
const CHAR16*类型,赋值给非const指针违反类型安全,开启-Werror时会被转为错误。
修复方法:
- 将结构体中的
CHAR16*成员改为CONST CHAR16*,符合EDK2编码规范。 - 若必须使用非const指针,确保初始化时使用可修改的CHAR16数组,而非字符串字面量。
内容的提问来源于stack exchange,提问作者Kotissimus
相关产品推荐
相关产品推荐

