error LNK2019: 未解析的外部符号

error LNK2019: unresolved external symbol

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

FilterGraphTestApp.obj : error LNK2019: unresolved external symbol "public: static class CUnknown * __stdcall CPushSourceBitmapSet::CreateInstance(struct IUnknown *,long *)" (?CreateInstance@CPushSourceBitmapSet@@SGPAVCUnknown@@PAUIUnknown@@PAJ@Z) referenced in function _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;
}

任何提示我还可以尝试什么?

这些可能是很好的理由:

  1. CreateInstance 在 header 中贴标但未在 cpp
  2. 中定义
  3. 您正在使用 CreateInstance,但包含它的 class 未在 dll 中导出。我是说

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

    你可以用记事本打开dll并搜索'CreateInstance'来检查它,如果找不到则不会导出到dll。

示例项目为您生成了一个 DLL。您不应该 link 它或将 LIB 与您的测试应用程序 (FilterGraphTestApp) 相关联。试图解决引用的 LNK2019 会让你无处可去。

相反,您应该注册 DLL,以便它将自身填充到已注册的 DirectShow 过滤器列表中。然后,您可以使用 GraphEdit 从那里以交互方式实例化它,或者使用 CoCreateInstance API 和相应的 CLSID 以编程方式实例化它(或者您可以使用名字对象)。

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