如何解决Visual Studio C++ WChar_t 库冲突
我正在使用 Visual Studio 处理 C++ 项目。目前我正在使用 2 个库,其中一个(我们称之为“no.lib”)需要将“将 WChar_t 视为内置类型”属性设置为“否”,而另一个('yes.lib') 需要它是 'yes'。因此,无论我将属性设置为什么,我的程序要么无法编译,要么无法运行。
我尝试了 this thread 中描述的解决方案,但对我不起作用。另外,如果可能的话,我想保持设置关闭,因为我的整个项目都是基于 no.lib 而我只使用 yes.lib 的两个函数。
我有哪些选择?
解决方法
Microsoft Docs 给出了解释:
如果您编写的新代码必须与旧代码互操作 仍然使用 wchar_t 的 typedef 版本,您可以提供重载 对于 wchar_t 的 unsigned short 和 __wchar_t 变体,所以 您的代码可以与使用 /Zc:wchar_t 或 没有它编译的代码。否则,您将不得不提供两个 库的不同版本,一个有和一个没有 /Zc:wchar_t 启用。即使在这种情况下,我们也建议您构建较旧的代码 通过使用与编译新代码相同的编译器。绝不 混合使用不同编译器编译的二进制文件。
当指定 /Zc:wchar_t 时,_WCHAR_T_DEFINED 和 _NATIVE_WCHAR_T_DEFINED 符号已定义。有关详细信息,请参阅预定义宏。
我建议您可以尝试添加以下代码:
#ifndef _WCHAR_T_DEFINED
typedef unsigned short wchar_t;
#define _WCHAR_T_DEFINED
#endif
编译 C++ 文件时,如果 /Zc:wchar_t
有效,则编译器预定义 _WCHAR_T_DEFINED
。如果 /Zc:wchar_t-
有效,则它不会 - 所以上面的代码段也应该适用于 C++。
你可以参考这个麻烦的方法。下面是一个例子:
实际上,lib中的一个函数使用wchar_t*
作为字符串,另一个lib使用unsigned short *
作为字符串。
如果不重新编译lib,解决办法是改头文件。现在两个库的头文件中的函数声明都声明使用wchar_t*
作为字符串。
但实际上 lib 导出的其中一个函数使用 unsigned short *
作为字符串。
如果A库在编译时使用“wchar_t作为内置类型”进行编译,则A库头文件有如下函数声明
void FunctionA(const wchar_t *wsz);
B库在编译时用“wchar_t not as a built-in type”编译,B库头文件有如下函数声明
void FunctionB(const wchar_t *wsz);
因为B lib是用"wchar_t not as a built-in type"编译的,所以B lib头文件中的wchar_t实际上是unsigned short。
所以现在新建一个工程,设置为“wchar_t是内置类型”,然后引入两个库A和B,然后修改B库的头文件。
更改为:
void FunctionB(const unsigned short *wsz);
不会有链接错误。就是打电话有点麻烦。
wchar_t wsz[] = L"Hello";
FunctionA(wsz);
FunctionB((const unsigned short *)wsz);
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。