链接错误编译时vshadow的,卷影复制服务SDK的一部分
-
23-08-2019 - |
题
我试图编译为VSS SDK
的C ++项目时得到这个连接错误Error 1 error LNK2019: unresolved external symbol "long __stdcall ShouldBlockRevert(wchar_t const *,bool *)" (?ShouldBlockRevert@@YGJPB_WPA_N@Z) referenced in function "public: void __thiscall VssClient::RevertToSnapshot(struct _GUID)" (?RevertToSnapshot@VssClient@@QAEXU_GUID@@@Z) revert.obj vshadow
在ShouldBlockRevert被使用两次,一次是当其在顶部被声明,并且一旦当实际使用过。
这里声明:
HRESULT APIENTRY ShouldBlockRevert(IN LPCWSTR wszVolumeName, OUT bool* pbBlock);
和这里使用:
CHECK_COM(::ShouldBlockRevert(Snap.m_pwszOriginalVolumeName, &bBlock));
if (bBlock)
{
ft.WriteLine(L"Revert is disabled on the volume %s because of writers",
Snap.m_pwszOriginalVolumeName);
return;
}
对不起,我不与C ++好。
解决方案
根据此博客帖子:
由于它发生,我跑DUMPBIN上vssapi.lib /出口,并发现它的出口ShouldBlockRevert,但由于C ++名称重整的重整名称是不同的。它为什么不一样?因为在vssapi.lib,第一个参数ShouldBlockRevert没有wchar_t的,它的无符号短。 “那又怎么样”,你在想,“他们相当于”。我不反对,但编译器会将它们视为不同类型的名称manging目的。有什么解决?那么,禁用在项目属性在C / C ++语言属性页的内在wchar_t的类型(等同于/ ZC:如果你是两个人谁建立与生成文件的Visual C ++项目,在这个星球上的一个wchar_t-切换)。
一旦这样做了,LPCWSTR宏定义为无符号短,名字改编的比赛,行星排列,并可以链接。 QED。
不隶属于 StackOverflow