1

尝试为 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++ 不太擅长。

4

1 回答 1

2

根据这篇博文:

碰巧,我在 vssapi.lib 上运行了 dumpbin /exports,发现它确实导出了 ShouldBlockRevert,但是由于 C++ 名称修改,修改后的名称不同。为什么不一样?因为在 vssapi.lib 中,ShouldBlockRevert 的第一个参数不是 wchar_t,它是 unsigned short。“那又怎样”,你在想,“它们是等价的”。我并不反对,但编译器出于名称管理的目的将它们视为不同的类型。解决方法是什么?好吧,在项目属性的 C/C++ 语言属性页中禁用固有 wchar_t 类型(如果您是地球上使用 makefile 构建 Visual C++ 项目的两个人之一,则相当于 /Zc:wchar_t- 开关)。

完成后,LPCWSTR 宏被定义为无符号短,名称修改匹配,行星对齐,您可以链接。QED。

于 2009-04-04T20:32:12.837 回答