Visual Studio C++;WChar\t库冲突 我正在使用VisualStudio开发C++项目。目前我正在使用两个库,其中一个(我们称之为'no.lib')要求将'Treat WChar_t as build-in-type'属性设置为'no',而另一个('yes.lib')则需要将其设置为'yes'。因此,无论我将属性设置为什么,我的程序要么无法编译,要么无法运行

Visual Studio C++;WChar\t库冲突 我正在使用VisualStudio开发C++项目。目前我正在使用两个库,其中一个(我们称之为'no.lib')要求将'Treat WChar_t as build-in-type'属性设置为'no',而另一个('yes.lib')则需要将其设置为'yes'。因此,无论我将属性设置为什么,我的程序要么无法编译,要么无法运行,c++,visual-studio,visual-c++,dll,wchar-t,C++,Visual Studio,Visual C++,Dll,Wchar T,我尝试了中描述的解决方案,但对我无效。此外,如果可能的话,我想保留这个设置,因为我的整个项目都基于no.lib,我只使用yes.lib的两个函数 我的选择是什么?给出了一个解释: 如果您编写的新代码必须与旧代码进行互操作 仍然使用wchar\u t的typedef版本,您可以提供重载 对于wchar\u t的无符号short和uu wchar\t变体,因此 您的代码可以与使用/Zc:wchar\u t编译的代码链接,或者 没有它编译的代码。否则,您必须提供两个 库的不同版本,一个有,一个没有/Z

我尝试了中描述的解决方案,但对我无效。此外,如果可能的话,我想保留这个设置,因为我的整个项目都基于no.lib,我只使用yes.lib的两个函数

我的选择是什么?

给出了一个解释:

如果您编写的新代码必须与旧代码进行互操作 仍然使用wchar\u t的typedef版本,您可以提供重载 对于wchar\u t的无符号short和uu wchar\t变体,因此 您的代码可以与使用/Zc:wchar\u t编译的代码链接,或者 没有它编译的代码。否则,您必须提供两个 库的不同版本,一个有,一个没有/Zc:wchar\t 启用。即使在这种情况下,我们也建议您构建较旧的代码 使用与编译新代码相同的编译器。从未 混合使用不同编译器编译的二进制文件

当指定/Zc:wchar\u t时,定义并 _定义了本机定义的符号。有关详细信息,请参见预定义宏


我建议您可以尝试添加以下代码:

#ifndef _WCHAR_T_DEFINED
typedef unsigned short wchar_t;
#define _WCHAR_T_DEFINED
#endif

编译C++文件时,如果<> >/ZC:WCHARGET,编译器预先定义<代码>如果>ZC:WCHARGET-实际上不这样做,那么上面的代码段也应该与C++很好地结合。


你可以参考这种麻烦的方法。以下是一个例子:

事实上,库中的一个函数使用
wchar\u t*
作为字符串,另一个库使用
无符号short*
作为字符串

如果不重新编译库,解决方案是更改头文件。现在,两个lib的头文件中的函数声明都声明使用
wchar\u t*
作为字符串

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

如果A库在编译时使用“wchar\u t作为内置类型”进行编译,则A库头文件具有以下函数声明

void FunctionA(const wchar_t *wsz);
void FunctionB(const wchar_t *wsz);
B库在编译时是使用“wchar_t not as a build-in-type”编译的,B库头文件具有以下函数声明

void FunctionA(const wchar_t *wsz);
void FunctionB(const wchar_t *wsz);
由于B lib是使用“wchar\u t不是内置类型”编译的,因此B lib头文件中的wchar\u t实际上是无符号短的

现在创建一个新项目,将其设置为“wchar_t是内置类型”,然后引入两个库a和B,然后修改B库的头文件

改为:

void FunctionB(const unsigned short *wsz);
不会有链接错误。打电话的时候有点麻烦

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

由于
wchar\u t
是一个基本的内置类型启动转换过程,请参见开始部分“如果您编写的新代码必须与仍然使用wchar\u t的typedef版本的旧代码进行互操作,您可以提供…”这里:感谢您的回复@Barnet Chou不幸的是,问题仍然存在。如果将“将WChar\u t视为内置类型”设置为否,则编译时会出现链接错误。如果设置为“是”,则错误发生在运行时(我的dll无法加载)。无论是否使用您提供的代码,这种行为都是相同的。还有什么我需要改变的吗?我建议你可以试试这个方法。