LPCSTR 和 wchar_t 问题。由于参数不匹配导致的链接器错误
Posted
技术标签:
【中文标题】LPCSTR 和 wchar_t 问题。由于参数不匹配导致的链接器错误【英文标题】:LPCSTR and wchar_t issue. Linker error because of parameter mismatch 【发布时间】:2015-04-06 21:37:39 【问题描述】:我将大量代码从 Visual Studio 移植到启用 mingw unicode 的项目中,我遇到了这个问题。我从派生类传递到基类的参数似乎不匹配。至少这是我的假设。我怀疑问题出在LPCSTR
类型上
typedef CONST CHAR *LPCSTR,*PCSTR;
现在这是基类
#ifdef UNICODE
CBasePin(
__in_opt LPCSTR pObjectName,
__in CBaseFilter *pFilter,
__in CCritSec *pLock,
__inout HRESULT *phr,
__in_opt LPCWSTR pName,
PIN_DIRECTION dir);
#endif
这是继承自基类并将参数传递给基类的类。
CAsyncOutputPin::CAsyncOutputPin(
HRESULT * phr,
CAsyncReader *pReader,
CAsyncIo *pIo,
CCritSec * pLock)
: CBasePin(
TEXT("Text Pin"),
pReader,
pLock,
phr,
TEXT("Output"),
PINDIR_OUTPUT
),
m_pReader(pReader),
m_pIo(pIo)
,m_bQueriedForAsyncReader(false) ////
这是我在构造函数初始化列表中遇到的链接器错误
undefined reference to `CBasePin::CBasePin(wchar_t const*, CBaseFilter*, CCritSec*, long*, wchar_t const*, _PinDirection)'|
关于我为什么会收到此链接器错误的任何建议。我有点困惑为什么这是一个链接器错误。我在猜测它是否是类型不匹配或者它会显示为编译器错误。关于如何为 Mingw 64bit gcc 解决此问题的任何建议?
【问题讨论】:
【参考方案1】:你的 CBasePin 有一个参数LPCSTR pObjectName
(类型为const char*
)和一个参数LPCWSTR pName
(类型为const wchar_t*
),在你调用它时你使用TEXT
-macro on一个字符文字,因此当定义 UNICODE 时,这两个文字都获得了 L 前缀,使它们成为 const wchar_t*
,因此 pObjectName 上存在类型不匹配。
如果未定义 UNICODE,那么您将得到相同的错误,但在 pName 上。
删除第一个 TEXT 应该没问题(对于 UNICODE 来说)。
【讨论】:
【参考方案2】:为什么要使用 TEXT 宏?你有一个 char * 参数和一个 wchar_t * 参数,它不能对两者都做正确的事情。
只要写下你的意思。类似的东西
"Text Pin", ..., L"Output", ...
【讨论】:
以上是关于LPCSTR 和 wchar_t 问题。由于参数不匹配导致的链接器错误的主要内容,如果未能解决你的问题,请参考以下文章
C++求助[Error]cannot convert 'const wchar_t*' to 'LPCSTR aka const char*
ANSI与Unicode编码,TCHAR | LPSTR | LPCSTR | LPWSTR | LPCWSTR | LPTSTR | LPCTSTR 的含义