错误LNK2019:未解析的外部符号

时间:2016-04-13 10:24:09

标签: c++ visual-studio-2013 directshow lnk2019

我想我已经在stackoverflow上阅读了有关此错误的所有内容,但我无法解决我的问题: 我有DirectShow PushSource Filter示例项目(.dll),我设法在VS2013中构建,还有另一个sln中的测试项目,它使用了PushSource.dll中的一些方法。 我链接了lib和一切,但无法摆脱这个链接器错误:

  

FilterGraphTestApp.obj:错误LNK2019:未解析的外部符号“public:static class CUnknown * __stdcall CPushSourceBitmapSet :: CreateInstance(struct IUnknown *,long *)”(?CreateInstance @ CPushSourceBitmapSet @@ SGPAVCUnknown @@ PAUIUnknown @@ PAJ @ Z )在函数_main

中引用

调用CreateInstance成员的代码:

// Get the interface for DirectShow's GraphBuilder
IUnknown *pUnk = NULL;
HRESULT *pHr = NULL;
CBaseFilter *pPSBS = (CBaseFilter*)CPushSourceBitmapSet::CreateInstance(pUnk, pHr); 

pGB->AddFilter(pPSBS, L"ImagesToVideoFilter");
pGB->QueryInterface(IID_IMediaControl, (void **)&pMC);

pMC->Run();

呼叫功能代码:

CUnknown * WINAPI CPushSourceBitmapSet::CreateInstance(IUnknown *pUnk, HRESULT *phr)
{
  CPushSourceBitmapSet *pNewFilter = new CPushSourceBitmapSet(pUnk, phr );
  if (phr)
  {
    if (pNewFilter == NULL) 
      *phr = E_OUTOFMEMORY;
    else
      *phr = S_OK;
  }

  return pNewFilter;
}

任何提示我还能尝试什么?

2 个答案:

答案 0 :(得分:2)

示例项目为您生成了一个DLL。您不应该将它或关联的LIB链接到您的测试应用程序(FilterGraphTestApp)。试图解决引用的LNK2019将无处可寻。

相反,您应该注册DLL,以便将其自身填充到已注册的DirectShow过滤器列表中。然后使用GraphEdit以交互方式从那里实例化它,或者使用 <asp:TableCell runat="server" onload="init();" > <canvas id="canvas" width="640" height="480" style="background-color:#FFFFFF"></canvas> <%--<object width="640" height="480"><embed src="../Images/Animations/animation-pharmacie.swf" width="640" height="480" /></object>--%> </asp:TableCell> API和相应的CLSID以编程方式实例化它(或者你可以使用名字对象)。

您也可以绕过COM注册,并包含PushSource头文件以共享一些声明,对于初学者来说,这可以保留。要使用CoCreateInstance,您将不需要示例项目的DLL,LIB。您不需要示例项目,除非您将源代码从那里借用到您自己的应用程序中并从BaseClasses目录链接文件(或由其构建产生的LIB)以在没有DLL的情况下将实现直接应用到您的应用程序中。这样CPushSourceBitmapSet::CreateInstance就行了。

答案 1 :(得分:1)

这些都是很好的理由:

  1. CreateInstance在标头中被decalred但未在cpp
  2. 中定义
  3. 您正在使用CreateInstance,但包含此内容的类未在dll中导出。我的意思是

    class __declspec(dllexport)YourClass {....}

    您可以使用记事本打开dll并搜索“CreateInstance”进行检查,如果找不到,则不会导出到dll。