簡體   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