我有一个用C语言构建的DLL(example.dll
),其中包含此功能:
void WINAPI free_job()
{
lc_free_job(jobPtr);
}
我已经构建了这个DLL并将example.lib
链接到我的Visual C ++项目中。现在我试图用一个简单的COM对象从一个ATL项目调用free_job()
方法。以下是引用库的标题的一部分:
#include "..\lib\example.h"
这是我在实施中称之为的地方:
STDMETHODIMP CCerberusSession::Free(CHAR* licensePath, CerberusErrorDetails* error)
{
free_job();
return S_OK;
}
它不会编译。我收到以下错误:
错误LNK2019未解析的外部符号" void __stdcall free_job(无效)" (?free_job @@ YGXXZ)在函数" public中引用: virtual long __stdcall CCerberusSession :: Free(char *,struct CerberusErrorDetails *)" (?创建@ @@ CCerberusSession @@@ UAGJPADPAUCerberusErrorDetails Z)
我做错了什么,如何解决或修复问题?任何想法都会有所帮助和赞赏。
编辑:我试图像这样包装include:
extern "C" {
#include "..\lib\example.h"
}
但如果我尝试像这样编译它,我会收到以下错误:
错误MSB8011无法注册输出。请尝试启用Per-user 使用命令提示符重定向或注册组件 提升权限。
我以管理员身份运行Visual Studio。还有什么可能是错的?
答案 0 :(得分:-1)
第一个问题是我需要包装#include
声明(谢谢你指出,Hans):
extern "C" {
#include "..\lib\example.h"
}
第二个问题归因于regsvr32.exe
。它找不到我的应用程序导入的依赖DLL,因为该DLL与我编译的ATL项目不在同一个输出目录中。例如,如果您在Visual Studio中检查Output
选项卡,您将看到如下内容:
1>C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V140\Microsoft.CppCommon.targets(1749,5): warning MSB3073: The command "regsvr32 /s "C:\Code\Cerberus\Debug\Cerberus.dll"" exited with code 3.
1>C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V140\Microsoft.CppCommon.targets(1761,5): error MSB8011: Failed to register output. Please try enabling Per-user Redirection or register the component from a command prompt with elevated permissions.
我只需要在输出目录中包含example.dll
:C:\Cerberus\Debug\
。