【问题标题】:LPCSTR and wchar_t issue. Linker error because of parameter mismatchLPCSTR 和 wchar_t 问题。由于参数不匹配导致的链接器错误
【发布时间】: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 解决此问题的任何建议?

【问题讨论】:

    标签: c++ visual-studio 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", ...
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-03-03
        • 1970-01-01
        • 2010-12-20
        • 2014-09-03
        • 2012-01-22
        相关资源
        最近更新 更多