LPCSTR 和 wchar_t 问题。由于参数不匹配导致的链接器错误
LPCSTR and wchar_t issue. Linker error because of parameter mismatch
我将大量代码从 Visual Studio 移植到启用了 mingw unicode 的项目,我 运行 到这个 issue.It 似乎我从派生 class 与基数 class 不匹配。至少那是我的假设。我怀疑问题出在类型 LPCSTR
在 mingw 中查看此类型时,我得到以下 typedef
typedef CONST CHAR *LPCSTR,*PCSTR;
现在这是基础class
#ifdef UNICODE
CBasePin(
__in_opt LPCSTR pObjectName,
__in CBaseFilter *pFilter,
__in CCritSec *pLock,
__inout HRESULT *phr,
__in_opt LPCWSTR pName,
PIN_DIRECTION dir);
#endif
这是继承基class并将参数传递给基class的class。
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 64 位 gcc 的这个问题有什么建议吗?
你的 CBasePin 有一个参数 LPCSTR pObjectName
(属于 const char*
类型)和一个参数 LPCWSTR pName
(属于 const wchar_t*
类型)并且在你对它的调用中你在字符文字上使用 TEXT
-macro,所以当定义 UNICODE 时,这两个文字都获得了 L 前缀,使它们成为 const wchar_t*
,所以有是 pObjectName 上的类型不匹配。
如果未定义 UNICODE 那么您将在 pName 上得到相同的错误。
删除第一个 TEXT,它应该没问题(对于 UNICODE 就是这样)。
为什么要使用 TEXT 宏?您有一个 char * 参数和一个 wchar_t * 参数,它不能对两者都做正确的事情。
写下你的意思。像
"Text Pin", ..., L"Output", ...
我将大量代码从 Visual Studio 移植到启用了 mingw unicode 的项目,我 运行 到这个 issue.It 似乎我从派生 class 与基数 class 不匹配。至少那是我的假设。我怀疑问题出在类型 LPCSTR
在 mingw 中查看此类型时,我得到以下 typedef
typedef CONST CHAR *LPCSTR,*PCSTR;
现在这是基础class
#ifdef UNICODE
CBasePin(
__in_opt LPCSTR pObjectName,
__in CBaseFilter *pFilter,
__in CCritSec *pLock,
__inout HRESULT *phr,
__in_opt LPCWSTR pName,
PIN_DIRECTION dir);
#endif
这是继承基class并将参数传递给基class的class。
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 64 位 gcc 的这个问题有什么建议吗?
你的 CBasePin 有一个参数 LPCSTR pObjectName
(属于 const char*
类型)和一个参数 LPCWSTR pName
(属于 const wchar_t*
类型)并且在你对它的调用中你在字符文字上使用 TEXT
-macro,所以当定义 UNICODE 时,这两个文字都获得了 L 前缀,使它们成为 const wchar_t*
,所以有是 pObjectName 上的类型不匹配。
如果未定义 UNICODE 那么您将在 pName 上得到相同的错误。
删除第一个 TEXT,它应该没问题(对于 UNICODE 就是这样)。
为什么要使用 TEXT 宏?您有一个 char * 参数和一个 wchar_t * 参数,它不能对两者都做正确的事情。
写下你的意思。像
"Text Pin", ..., L"Output", ...