问题描述
我们一直在使用旧的、预先构建的 Xerces 3.1.1 版本,它具有:
3.1.1:Xerces_autoconf_config.hpp
#ifdef _NATIVE_WCHAR_T_DEFINED
# define XERCES_XMLCH_T wchar_t
#else
# define XERCES_XMLCH_T unsigned short
#endif
...
typedef XERCES_XMLCH_T XMLCh;
转向使用 vcpkg 它已经安装了 3.2.3 并且我们有编译错误,因为它使用的是 wchar_t
:
3.2.3:Xerces_autoconf_config.hpp
#define XERCES_XMLCH_T char16_t
...
typedef XERCES_XMLCH_T XMLCh;
我们有很多的代码调用src.setEncoding(L"UTF-16");
,这显然会导致错误,例如:
void xercesc_3_2::InputSource::setEncoding(const XMLCh *const )': 无法将参数 1 从“const wchar_t [7]”转换为“const XMLCh” *常量'
我不确定 Xerces 是否已更改,或者这是否是 vcpkg 的默认构建设置的结果。是否可以将其恢复到 wchar_t
(黑客来源除外),如果可以,如何恢复?不幸的是,我是一个彻头彻尾的 cmake 菜鸟。
解决方法
好的,根据xerces-c docs:
XMLCh 类型(UTF-16 字符类型):
选项 | 说明 |
---|---|
-Dxmlch-type=char16_t | 使用 char16_t(需要 C++11 编译器) |
-Dxmlch-type=uint16_t | 如果标准类型不可用,请使用 uint16_t from 或 |
-Dxmlch-type=wchar_t | 使用 wchar_t(仅限 Windows) |
在vcpkg中,这部分通过特性公开:
vcpkg install xerces-c[xmlch-wchar]
XMLCh 类型使用 wchar_t