‘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*? Есть ли решение?

0

Решение

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

Мы должны были двигаться byte из глобального пространства имен в CryptoPP пространство имен из-за C ++ 17 и std::byte, Изменение произошло в Совершить 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, Определение типа байта.

2

Другие решения

Первая проблема решена с изменением 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/#download

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

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

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

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

Эта опция в:

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

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

  • C / C ++

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

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

0