在Visual Studio 2012中,我尝试使用加密++库加密文件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 kits8.0includesharedrpcndr.h(164) : unsigned char byte'
or 'z:cryptographyapp_aesencryptionaes headersconfig.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*
有关吗?有什么解决办法吗?
'byte' : 使用 Crypto++ 时出现不明确的符号错误
由于 C++17 和std::byte
,我们不得不byte
从全局命名空间移动到CryptoPP
命名空间。更改发生在提交 00f9818b5d8e 处,这是 Crypto++ 6.0 版本的一部分。
Crypto++ 用于将byte
放在全局命名空间中,以便与Microsoft SDK 兼容。如果没有全局字节,那么您将再次遇到'byte' : ambiguous symbol error
。
您看到的错误是因为您使用了using namespace CryptoPP;
并且Microsoft工具包仍然在全局命名空间中放置了一个byte
。该错误未在 Qt 下出现,因为 Qt 不会在全局命名空间中放置字节。
在Crypto++维基上std::byte
讨论了几种解决方法。
顺便说一下,Microsoft套件代码在遇到 C++17 编译器时会中断,并且由于 Microsoft 的全局byte
而std::byte
。使用Windows套件时,您会遇到相同的错误。具有讽刺意味的是,Microsoft名员工撰写了C++std::byte
。另请参阅PR0298R0字节类型定义。
将byte*
更改为CryptoPP::byte*
解决了第一个问题:
CBC_Mode<AES>::Encryption encryptor((CryptoPP::byte*)szKey, AES::DEFAULT_KEYLENGTH, (CryptoPP::byte*)szInitVector);
但是要解决第二个问题(error LNK 2038
(:
这与link error
有关,在Visual Studio中使用crypto++
的每个身体都可能有这个问题。
首先,我从下面的链接下载了可视化工作室的库,其中包含.sln
(VS解决方案(:
https://www.cryptopp.com/#download
我通过批量构建库作为
cryptlib
两种状态(Debug|Win32
和Release|Win32
的项目(- 因为我使用了
Debug
模式,所以我在依赖项部分中cryptopp700Win32OutputDebug
链接了cryptlib.lib
。 - 还要为头文件添加依赖项...
但是我忘记了项目属性中的一些内容:
最后,我将运行时库选项设置为多线程调试 (/MTd(
此选项位于:
项目属性
配置属性
C/C++
代码生成
运行时库
我知道这个答案与Crypto++和Windows SDK没有直接关系,但我知道我在尝试使用名为Nan的Nodejs插件库时发现了这一点。 我把这个答案放在这里,因为它对于可能遇到与我类似问题的其他人来说是一个可访问的地方。
我在编译项目时有一段时间没有遇到太多问题,但随后遇到了与上述相同的错误。 我没有在任何地方使用byte
符号。 有数十个错误指向Windows SDK中的库,这些库也与作为错误地址的cstddef
标头冲突。
为了解决这个问题,我能够做的是重新排列标头,以便与 Nan 相关的内容(以及我自己的任何引用它的头文件(位于顶部,甚至高于其他标准 C/C++ 库。 完成后,错误消失了。
决定很简单。从代码中删除"使用命名空间 std",并在每次操作之前使用命名空间 std::。
试试这个:
#define _HAS_STD_BYTE 0