我面临着一个奇怪的问题。
我正在编译一个MFC应用程序(VS 2008),它使用静态库MyLib.lib.it在调试模式下编译正常。 但在调试Unicode中它显示错误。我在MFC应用程序中使用调试Unicode版本的MyLib.lib。
Main.obj : error LNK2019: unresolved external symbol "void * __cdecl VCI_Open_Device(wchar_t *)" (?VCI_Open_Device@@YAPAXPA_W@Z) referenced in function _wmain
VCIHANDLE
VCI_Open_Device ( TCHAR *ptszDevicePath
);
这里我注意到在MFC App中,在调试模式下,TCHAR是typedef char TCHAR,这是正确的但在调试Unicode模式下,TCHAR应该是typedef WCHAR TCHAR,但这里也显示了typedef char TCHAR。 我检查了WebCam.lib项目TCHAR是调试Unicode模式下的typedef WCHAR TCHAR,它是正确的。
我想在MFC应用程序模式下调试Unicode模式中的某些设置存在问题。 请帮助解决此问题。 #ifdef UNICODE // r_winnt
#ifndef _TCHAR_DEFINED
typedef WCHAR TCHAR, *PTCHAR;
typedef WCHAR TBYTE , *PTBYTE ;
#define _TCHAR_DEFINED
#endif /* !_TCHAR_DEFINED */
typedef LPWCH LPTCH, PTCH;
typedef LPCWCH LPCTCH, PCTCH;
typedef LPWSTR PTSTR, LPTSTR;
typedef LPCWSTR PCTSTR, LPCTSTR;
typedef LPUWSTR PUTSTR, LPUTSTR;
typedef LPCUWSTR PCUTSTR, LPCUTSTR;
typedef LPWSTR LP;
typedef PZZWSTR PZZTSTR;
typedef PCZZWSTR PCZZTSTR;
typedef PUZZWSTR PUZZTSTR;
typedef PCUZZWSTR PCUZZTSTR;
typedef PNZWCH PNZTCH;
typedef PCNZWCH PCNZTCH;
typedef PUNZWCH PUNZTCH;
typedef PCUNZWCH PCUNZTCH;
#define __TEXT(quote) L##quote // r_winnt
#else /* UNICODE */ // r_winnt
#ifndef _TCHAR_DEFINED
typedef char TCHAR, *PTCHAR;
typedef unsigned char TBYTE , *PTBYTE ;
#define _TCHAR_DEFINED
#endif /* !_TCHAR_DEFINED */
typedef LPCH LPTCH, PTCH;
typedef LPCCH LPCTCH, PCTCH;
typedef LPSTR PTSTR, LPTSTR, PUTSTR, LPUTSTR;
typedef LPCSTR PCTSTR, LPCTSTR, PCUTSTR, LPCUTSTR;
typedef PZZSTR PZZTSTR, PUZZTSTR;
typedef PCZZSTR PCZZTSTR, PCUZZTSTR;
typedef PNZCH PNZTCH, PUNZTCH;
typedef PCNZCH PCNZTCH, PCUNZTCH;
#define __TEXT(quote) quote // r_winnt
#endif /* UNICODE */
当我右键单击TCHAR时,它不会进入UNICODE部分。
答案 0 :(得分:1)
确保所有东西都使用相同的tchar处理。转到项目/属性/ C-C ++ /语言/将w_chart视为内置类型,并检查它是否也为您的库/应用程序设置了相同的值。默认设置为否(/ Zc:wchar_t - )
答案 1 :(得分:0)
确保您链接的每个模块都使用相同的字符编码设置(例如,每个模块都使用Unicode构建,即将TCHAR扩展为wchar_t)。
以Unicode模式构建是自VS2005以来的默认设置。
您可以从IDE或#defining both UNICODE and _UNICODE更改设置。
答案 2 :(得分:0)
更改影响这些内容的设置后,您是否进行了“全部重建”?我不确定编译器是否知道自己这样做,也就是说,它可能不会重新编译需要重新编译的所有内容,最终你可能会得到一些带有8位TCHARS的模块和其他带有16位模块的模块。