为什么我的外部库方法无法解决?

时间:2017-03-23 19:19:34

标签: visual-c++ dll com linker atl

我有一个用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。还有什么可能是错的?

1 个答案:

答案 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.dllC:\Cerberus\Debug\