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;
}
任何提示我还可以尝试什么?
这些可能是很好的理由:
- CreateInstance 在 header 中贴标但未在 cpp
中定义
您正在使用 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
就可以了。
我想我已经在 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;
}
任何提示我还可以尝试什么?
这些可能是很好的理由:
- CreateInstance 在 header 中贴标但未在 cpp 中定义
您正在使用 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
就可以了。