为什么我的外部库方法无法解析?
Why won't my external library method resolve?
我有一个用 C 语言构建的 DLL (example.dll
),其中有这个函数:
void WINAPI free_job()
{
lc_free_job(jobPtr);
}
我已构建此 DLL 并将 example.lib
链接到我的 Visual C++ 项目中。现在我试图从一个带有简单 COM object 的 ATL 项目中调用 free_job()
方法。这是我的 header 中引用库的一部分:
#include "..\lib\example.h"
这是我在实现中调用它的地方:
STDMETHODIMP CCerberusSession::Free(CHAR* licensePath, CerberusErrorDetails* error)
{
free_job();
return S_OK;
}
它不会编译。我收到以下错误:
Error LNK2019 unresolved external symbol "void __stdcall
free_job(void)" (?free_job@@YGXXZ) referenced in function "public:
virtual long __stdcall CCerberusSession::Free(char *,struct
CerberusErrorDetails *)"
(?Create@CCerberusSession@@UAGJPADPAUCerberusErrorDetails@@@Z)
我做错了什么,我该如何排除故障或修复它?任何想法都会有所帮助和赞赏。
编辑:我试过像这样包装包含:
extern "C" {
#include "..\lib\example.h"
}
但是如果我尝试这样编译它,我会得到以下错误:
Error MSB8011 Failed to register output. Please try enabling Per-user
Redirection or register the component from a command prompt with
elevated permissions.
我是 运行 Visual Studio 管理员。这里还有什么问题?
第一个问题是我需要包装 #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\
.
我有一个用 C 语言构建的 DLL (example.dll
),其中有这个函数:
void WINAPI free_job()
{
lc_free_job(jobPtr);
}
我已构建此 DLL 并将 example.lib
链接到我的 Visual C++ 项目中。现在我试图从一个带有简单 COM object 的 ATL 项目中调用 free_job()
方法。这是我的 header 中引用库的一部分:
#include "..\lib\example.h"
这是我在实现中调用它的地方:
STDMETHODIMP CCerberusSession::Free(CHAR* licensePath, CerberusErrorDetails* error)
{
free_job();
return S_OK;
}
它不会编译。我收到以下错误:
Error LNK2019 unresolved external symbol "void __stdcall free_job(void)" (?free_job@@YGXXZ) referenced in function "public: virtual long __stdcall CCerberusSession::Free(char *,struct CerberusErrorDetails *)" (?Create@CCerberusSession@@UAGJPADPAUCerberusErrorDetails@@@Z)
我做错了什么,我该如何排除故障或修复它?任何想法都会有所帮助和赞赏。
编辑:我试过像这样包装包含:
extern "C" {
#include "..\lib\example.h"
}
但是如果我尝试这样编译它,我会得到以下错误:
Error MSB8011 Failed to register output. Please try enabling Per-user Redirection or register the component from a command prompt with elevated permissions.
我是 运行 Visual Studio 管理员。这里还有什么问题?
第一个问题是我需要包装 #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\
.