'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):
Я собираю библиотеку через 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:: перед каждой операцией.