我将大量代码从Visual Studio移植到mingw启用unicode的项目,我遇到了这个问题。似乎我从派生类传递给基类的参数不匹配。至少是我的假设。我怀疑问题是LPCSTR
类型在mingw中看到这种类型我得到了下面的typedef
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解决此问题的任何建议吗?
答案 0 :(得分:3)
你的CBasePin有一个参数LPCSTR pObjectName
(类型为const char*
)和一个参数LPCWSTR pName
(类型为const wchar_t*
),在你的调用中你和# 39;在char-literal上重新使用TEXT
- 宏,因此当定义 UNICODE 时,那些获得L前缀的文字都会使它们const wchar_t*
,所以有一个类型pObjectName不匹配。
如果没有定义UNICODE,那么你会得到相同的错误但是在pName上。
删除第一个TEXT,它应该是Ok(对于UNICODE)。
答案 1 :(得分:0)
为什么使用TEXT宏?你有一个char *参数和一个wchar_t *参数,它不能为两者做正确的事。
只要写下你的意思。像
这样的东西"Text Pin", ..., L"Output", ...