繁体   English   中英

Visual Studio C++ WChar_t 库冲突

[英]Visual Studio C++ WChar_t library conflict

我正在使用 Visual Studio 开发 C++ 项目。 目前我正在使用 2 个库,其中一个(我们称之为“no.lib”)需要将“将 WChar_t 视为内置类型”属性设置为“否”,而另一个('yes.lib') 需要它是'yes'。 因此,无论我将属性设置为什么,我的程序都将无法编译或无法运行。

我尝试了此线程中描述的解决方案,但它对我不起作用。 另外,如果可能的话,我想保持关闭,因为我的整个项目都是基于 no.lib 的,而我只使用了 yes.lib 的两个函数。

我有哪些选择?

Microsoft Docs给出了解释:

如果您编写的新代码必须与仍然使用 wchar_t 的 typedef 版本的旧代码互操作,您可以为 wchar_t 的 unsigned short 和 __wchar_t 变体提供重载,以便您的代码可以与使用 /Zc 编译的代码链接: 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,解决方法是更改header文件。 现在两个库的 header 文件中的 function 声明都声明使用wchar_t*作为字符串。

但实际上 lib 导出的函数之一使用unsigned short *作为字符串。

如果A库编译时使用“wchar_t作为内置类型”编译,A库header文件有如下function声明

void FunctionA(const wchar_t *wsz);

B库编译时用“wchar_t not as a built-in type”编译,B库header文件有如下function声明

void FunctionB(const wchar_t *wsz);

因为B lib是用“wchar_t not as a built-in type”编译的,所以B lib header文件中的wchar_t实际上是unsigned short。

所以现在新建一个工程,设置为“wchar_t是内置类型”,然后引入A和B两个库,然后修改B库的header文件。

改成:

void FunctionB(const unsigned short *wsz);

不会有链接错误。 就是打电话的时候有点麻烦。

wchar_t wsz[] = L"Hello";
FunctionA(wsz);
FunctionB((const unsigned short *)wsz);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM