为啥我的外部库方法无法解析?

Posted

技术标签:

【中文标题】为啥我的外部库方法无法解析?【英文标题】:Why won't my external library method resolve?为什么我的外部库方法无法解析? 【发布时间】:2017-08-16 13:04:02 【问题描述】:

我有一个用 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(void)" (?free_job@@YGXXZ) 在函数 "public: 虚拟长 __stdcall CCerberusSession::Free(char *,struct CerberusErrorDetails *)" (?Create@CCerberusSession@@UAGJPADPAUCerberusErrorDetails@@@Z)

我做错了什么,我该如何排除或修复它?任何想法都会有所帮助和赞赏。

编辑:我尝试像这样包装包含:

extern "C" 
#include "..\lib\example.h"

但是如果我尝试像这样编译它会出现以下错误:

错误 MSB8011 无法注册输出。请尝试启用每用户 从命令提示符重定向或注册组件 提升权限。

我以管理员身份运行 Visual Studio。这里还有什么问题?

【问题讨论】:

编译得很好,它不链接。请注意链接器错误消息中的 C++ 名称修饰。 C 标识符不应该被破坏。你需要extern "C" 围绕那个#include。 @HansPassant 谢谢汉斯。如果我包装包含,我现在看到一个不同的错误:Error MSB8011 Failed to register output. Please try enabling Per-user Redirection or register the component from a command prompt with elevated permissions. 我已经编辑了这个问题。关于这里还有什么问题的任何想法?我不确定,但这是否与它是一个 ATL 项目有关,并且它现在无法在系统上注册输出?是否与无法解析包含的 DLL 有关?任何想法都会有很大帮助。 当然是完全不同的问题。不知道“提升的权限”是什么意思? google的很好,尽量不要手足无措。 @HansPassant 我假设提升的权限意味着它是否以具有管理员权限的管理员身份运行,在这种情况下,我的 Visual Studio 实例正在运行,所以它假脱机来注册的任何进程输出也应该在相同的权限范围内。它一定与注册我的 COM 对象有关...感谢您的帮助。 【参考方案1】:

第一个问题是我需要包装 #include 声明(感谢您指出这一点,汉斯):

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\

【讨论】:

以上是关于为啥我的外部库方法无法解析?的主要内容,如果未能解决你的问题,请参考以下文章

为啥错误 LNK2001:在这种情况下无法解析外部符号? [复制]

dcmtk lnk2019 无法解析外部符号

为啥“WinMain”在链接为 *.a 静态库时无法解析?

FFmpeg视频编解码库,无法解析的外部信号

FFmpeg视频编解码库,无法解析的外部信号

无法解析的外部符号