'byte': неоднозначная ошибка символа при использовании Crypto++ и Windows SDK

В Visual Studio 2012 я пытаюсь зашифровать файл с помощью библиотеки Crypto++ с AES шифрование и CBC режим следующим образом:

#include <Windows.h>
#include "aes.h"
#include "modes.h"
#include "files.h"
#include <Shlwapi.h>

using namespace CryptoPP;

INT main(INT argc, CHAR *argv[])
{
    CHAR szKey[16] = {0};
    CHAR szInitVector[AES::DEFAULT_KEYLENGTH] = {0};

    StrCpyA(szKey, "qqwweeff88lliioo");
    StrCpyA(szInitVector, "eerrttooppkkllhh");

    CBC_Mode<AES>::Encryption encryptor((byte*)szKey, AES::DEFAULT_KEYLENGTH, (byte*)szInitVector);
    FileSource fs("in.txt", true, new StreamTransformationFilter(encryptor, new FileSink("out.aes")));

    return 0;
}

В Qt это работает!, но здесь я удивился, почему получил следующее error:

error C2872: 'byte' : ambiguous symbol
could be 'c:\program files (x86)\windows kits\8.0\include\shared\rpcndr.h(164) : unsigned char byte'
or 'z:\cryptography\app_aesencryption\aes headers\config.h(237) : CryptoPP::byte'

Из-за предотвращения ambiguous symbol ошибка, даже я произнесла ниже заявление с CryptoPP::byte*:

CBC_Mode<AES>::Encryption encryptor((CryptoPP::byte*)szKey, AES::DEFAULT_KEYLENGTH, (CryptoPP::byte*)szInitVector);

Я не получил ошибку для 'byte' : ambiguous symbolНо это даст мне много errors как:

error LNK 2038

Кстати, я связал .lib файл Crypto++, поэтому я думаю, что эта ошибка вряд ли для этого. Последний error относится к CryptoPP::byte*? Есть ли решение?

5 ответов

Решение

Первая проблема решена с изменением byte* в CryptoPP::byte*:

CBC_Mode<AES>::Encryption encryptor((CryptoPP::byte*)szKey, AES::DEFAULT_KEYLENGTH, (CryptoPP::byte*)szInitVector);

Но для решения второй проблемы (error LNK 2038):

Это связано с link errorКаждое тело, которое использует crypto++ В Visual Studio может возникнуть эта проблема.

Сначала я скачал библиотеку по ссылке ниже для визуальной студии, в которой содержится .sln (Решение VS):

  • https://www.cryptopp.com/

  • Я собираю библиотеку через Batch Build как cryptlib проект в обоих штатах (Debug|Win32 а также Release|Win32)

  • Потому что я использовал из Debug режим я связал cryptlib.lib в cryptopp700\Win32\Output\Debug в разделе зависимостей.
  • Также добавьте зависимости для заголовочных файлов...

Но я что-то забыл в свойствах проекта:

Наконец, я установил опцию Runtime Library для многопоточной отладки (/MTd)

Эта опция в:

  • Свойства проекта

  • Свойства конфигурации

  • C/C++

  • Генерация кода

  • Библиотека времени исполнения

'byte': неоднозначная ошибка символа при использовании Crypto++

Мы должны были двигаться byte из глобального пространства имен в CryptoPP пространство имен из-за C++17 и std::byte, Изменение произошло в Commit 00f9818b5d8e, который был частью выпуска Crypto++ 6.0.

Crypto++ раньше ставил byte в глобальном пространстве имен для совместимости с Microsoft SDK. Без глобального байта тогда вы встретите 'byte' : ambiguous symbol error снова.

Вы видите ошибку, потому что вы использовали using namespace CryptoPP; и наборы Microsoft по-прежнему положить byte в глобальном пространстве имен. Ошибка не появилась в Qt, потому что Qt не помещает байт в глобальное пространство имен.

Есть несколько обходных путей, обсуждаемых на std::byte на Crypto++ вики.

Между прочим, код набора Microsoft сломается, когда он встретит компилятор C++17 и std::byte из-за глобального Microsoft byte, Вы столкнетесь с той же ошибкой при использовании комплектов Windows. По иронии судьбы, сотрудники Microsoft создали C++ std::byte, Также см. PR0298R0, Определение типа байта.

Я знаю, что этот ответ не имеет прямого отношения к Crypto ++ и Windows SDK, но я знаю, что нашел это, пытаясь выяснить ту же ошибку при использовании библиотеки дополнений Nodejs под названием Nan. Я помещаю этот ответ здесь, потому что он находится в доступном месте для других, которые могут столкнуться с аналогичными проблемами со мной.

Некоторое время у меня не было слишком много проблем с компиляцией проекта, но затем я столкнулся с той же ошибкой, что упоминалась выше. Я не использовал byteсимвол где угодно. Были десятки ошибок, указывающих на библиотеки в Windows SDK, которые также конфликтовали с cstddef заголовок в качестве адреса ошибки.

Что мне удалось сделать, чтобы решить эту проблему, так это переупорядочить заголовки так, чтобы контент, связанный с Nan (и любой из моих собственных файлов заголовков, которые ссылаются на него), был сверху, даже над другими стандартными библиотеками C/C++. После этого ошибки исчезли.

Решение самое простое. Удалите из своего кода «используя пространство имен std» и вместо этого используйте пространство имен std:: перед каждой операцией.

Попробуй это:

#define _HAS_STD_BYTE 0

Другие вопросы по тегам