Крипто++ в Windows XP

Я пытаюсь собрать Crypto++ и ориентироваться на Windows XP. Читаю это, я внес эти изменения перед сборкой библиотеки:

  • Набор инструментов платформы = Visual Studio 2017 — Windows XP (v141_xp) Набор инструментов платформы = Visual Studio 2017 — Windows XP (v141_xp)

  • Предопределить макросы WINVER=0x0501 и _WIN32_WINNT=0x0501 WINVER=0x0501

Затем я скомпилировал некоторый код (с теми же изменениями, что и раньше для совместимости с XP):

#include <iostream>
#include <stdio.h>

#include <cryptopp/cryptlib.h>
#include <cryptopp/blake2.h>


int main() {
    using namespace CryptoPP;

    BLAKE2b hash;
    std::string password = "hunter1";
    hash.Update((const byte*)password.data(), password.size());

    std::string digest;
    digest.resize(hash.DigestSize());
    
    hash.Final((byte*)&digest[0]);

    printf("Message: %s\n", password.c_str());
    puts("Digest:");

    for (char ch : digest)
        printf("%02hhX", ch);

    putchar('\n');
}

Это отлично работает в Windows 10, но когда я копирую каталог Release в Windows XP для тестирования, я получаю эту ошибку:

введите здесь описание изображения]

Итак, что я делаю не так, и как мне использовать эту библиотеку в Windows XP, если вообще можно?


person Ayxan Haqverdili    schedule 16.03.2021    source источник
comment
Установите vmware и запустите Windows 10 внутри него.   -  person Hi - I love SO    schedule 16.03.2021
comment
@ Hi-IloveSO Мне нужно настроить таргетинг на Windows XP, а не на Windows 10, работающую на виртуальной машине.   -  person Ayxan Haqverdili    schedule 16.03.2021
comment
InitializeCriticalSectionEx не существует в Windows ХР. Вы можете (только) ссылаться на него динамически, как описано в разделе InitializeCriticalSectionEx, не расположенном в KERNEL32.Dll, хотя есть дополнительные сложности, если он используется кодом библиотеки.   -  person dxiv    schedule 16.03.2021
comment
@dxiv используется библиотекой Crypto ++, поэтому я не могу использовать InitializeCriticalSection, как описано в ответе, который вы указали. Похоже, это означает, что библиотека, вероятно, не поддерживает XP.   -  person Ayxan Haqverdili    schedule 16.03.2021
comment
cryptopp, похоже, не использует InitializeCriticalSectionEx   -  person Alan Birtles    schedule 16.03.2021
comment
см. stackoverflow.com/questions/22709094/   -  person Alan Birtles    schedule 16.03.2021
comment
@AyxanHaqverdili В этом есть что-то подозрительное. WinSDK 7.1 winbase.h объявляет InitializeCriticalSectionEx условным для #if (_WIN32_WINNT >= 0x0403), но задокументировано, что API существует только в Vista и более поздних версиях, то есть >= 0x600. Хотя есть также #define CRITICAL_SECTION_NO_DEBUG_INFO RTL_CRITICAL_SECTION_FLAG_NO_DEBUG_INFO, который предполагает какую-то переадресацию, хотя я не следил за ней полностью.   -  person dxiv    schedule 16.03.2021
comment
@AlanBirtles Большое спасибо. Создание динамической библиотеки времени выполнения для CryptoPP (/MD) устранило проблему. Я предполагаю, что это может быть закрыто как дубликат вопроса, который вы связали.   -  person Ayxan Haqverdili    schedule 16.03.2021