LPCSTR和wchar_t问题。由于参数不匹配导致链接器错误

时间:2015-04-06 21:37:40

标签: c++ visual-studio gcc

我将大量代码从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解决此问题的任何建议吗?

2 个答案:

答案 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", ...