一、开发环境
开发软件:keil
版本:v6.21(AC6);


二、问题描述
开发过程中,在导入第三方库.lib 编译时,出现 wchart-16 clashes with wchart-32 的报错;

三、出现的原因
1、关于 enum / wchar
enum 类型的底层存储类型是由编译器实现定义的,通常默认为 int(4字节);
当开启 Short enums 选项后,编译器会尝试使用最小可能的整数类型来表示枚举值(比如 char、short 等),只要能容纳所有枚举常量即可;
使用 Short enums (1字节) 可节省内存 !
wchar_t 是 C/C++ 中用于宽字符的类型,其大小也是由编译器实现定义的 ;
当开启 Short wchar 选项后, wchar_t 将变为 2 字节;
可以选择 wchar_t 为 2 字节 或 4 字节;
2、报错原因
在使用第三方 lib库时,库中混合使用了两种不同宽度的 wchar_t 类型,一部分代码 / 库编译时使用 wchar_t 为 16 位,另一部分使用 32 位,从而导致链接冲突;
wchart-16 clashes with wchart-32
3、编译器配置
默认情况:在使用AC6编译时,会自动勾选 Short enums/wchar ;
等同于 -fshort-enums -fshort-wchar


当开启 Short enums/wchar时,可能会导致与一些库不兼容,与未开启该选项的库链接时出错;
四、解决方案
方法一
关闭 Short enums/whcar 选项
即使用 enums(4字节),wchar_t (4字节);
取消勾选 Short enums/whcar 选项 即可;


方法二
只关闭 Short wchar
启用 Short enums (1字节) ,而 wchar_t 大小为 4字节;
同样取消勾选 Short enums/whcar 选项;
在 Misc Controls 中添加:-fshort-enums,开启 Short enums,以节省内存空间;
如图所示:


我要赚赏金
