Ошибка компоновщика при компиляции vshadow, части SDK службы теневого копирования томов.
-
23-08-2019 - |
Вопрос
Я получаю эту ошибку компоновщика при попытке скомпилировать проект C++ для VSS SDK.
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
Метод FollowBlockRevert используется дважды: один раз, когда он объявлен вверху, и один раз, когда он фактически используется.
Заявлено здесь:
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;
}
Извините, я не так хорош в С++.
Решение
В соответствии с этот Сообщение блога:
Так получилось, что я запустил dumpbin/exports на vssapi.lib и обнаружил, что он экспортирует MustBlockRevert, но благодаря искажению имени C++ искаженное имя отличается.Почему все по-другому?Поскольку в vssapi.lib первый аргумент MustBlockRevert — это не wchar_t, а беззнаковый короткий параметр.«Ну и что», — думаете вы, — «они равнозначны».И я не согласен, но компилятор рассматривает их как разные типы в целях управления именами.Что исправить?Итак, отключите встроенный тип wchar_t на странице свойств языка C/C++ в свойствах проекта (эквивалент переключателя /Zc:wchar_t-, если вы один из двух людей на планете, которые создают проекты Visual C++ с помощью make-файлов).
Как только это будет сделано, макрос LPCWSTR будет определен как беззнаковый короткий, совпадения имен, выравнивание планет, и вы сможете связать их.КЭД.