'byte' : 使用 Crypto++ 和 Windows SDK 时出现模糊符号错误
'byte' : ambiguous symbol error when using of Crypto++ and 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.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
顺便说一下,我链接了 Crypto++ 的 .lib
文件,所以我认为这个错误不太可能。
最后 error
与 CryptoPP::byte*
相关吗?有什么解决办法吗?
将 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++
的每个人都可能有这个问题。
首先,我从下面的 link 下载库 visual studio,其中包含 .sln
(VS 解决方案):
我通过 Batch Build 将库构建为 cryptlib
项目,处于两种状态(Debug|Win32
和 Release|Win32
)
- 因为我使用了
Debug
模式,所以我 link 在依赖项部分的 cryptopp700\Win32\Output\Debug
中编辑了 cryptlib.lib
。
- 同时添加头文件的依赖...
但是我在项目属性中忘记了一些东西:
最后,我将 Runtime Library 选项设置为 Multi-threaded Debug (/MTd)
这个选项在:
项目属性
配置属性
C/C++
代码生成
运行库
'byte' : ambiguous symbol error when using of Crypto++
由于 C++17 和 std::byte
,我们不得不将 byte
从全局命名空间移动到 CryptoPP
命名空间。更改发生在 Commit 00f9818b5d8e,这是 Crypto++ 6.0 版本的一部分。
Crypto++ 用于将 byte
放入全局命名空间以与 Microsoft SDK 兼容。如果没有全局字节,那么您将再次遇到 'byte' : ambiguous symbol error
。
您看到的错误是因为您使用了 using namespace CryptoPP;
和 Microsoft 套件仍然放置了 byte
在全局命名空间中。该错误在 Qt 下没有出现,因为 Qt 没有在全局命名空间中放置一个字节。
在 Crypto++ wiki 的 std::byte
中讨论了几种解决方法。
顺便说一句,Microsoft 套件代码在遇到 C++17 编译器和 std::byte
时会中断,因为 Microsoft 的全局 byte
。使用 Windows 套件时,您会遇到同样的错误。具有讽刺意味的是,Microsoft 员工编写了 C++ std::byte
。另见 PR0298R0, A byte type definition.
我知道这个答案与 Crypto++ 和 Windows SDK 没有直接关系,但我知道我在使用名为 Nan 的 Nodejs 插件库时试图找出同样的错误时发现了这个问题。我将这个答案放在这里是因为其他人可能 运行 遇到与我类似的问题。
一段时间以来,我在编译项目时没有遇到太多问题,但后来 运行 出现了与上述相同的错误。我没有在任何地方使用 byte
符号。有许多错误指向 Windows SDK 中的库,这也与作为错误地址的 cstddef
header 冲突。
我能够解决问题的方法是重新运行调整 headers 以便 Nan-related 内容(以及我自己的任何 header引用它的文件)在顶部,甚至在其他标准 C/C++ 库之上。完成后,错误消失了。
决定是最简单的。从您的代码中删除 'using namespace std' 并在每次操作之前使用命名空间 std:: 代替。
在 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.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
顺便说一下,我链接了 Crypto++ 的 .lib
文件,所以我认为这个错误不太可能。
最后 error
与 CryptoPP::byte*
相关吗?有什么解决办法吗?
将 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++
的每个人都可能有这个问题。
首先,我从下面的 link 下载库 visual studio,其中包含 .sln
(VS 解决方案):
我通过 Batch Build 将库构建为
cryptlib
项目,处于两种状态(Debug|Win32
和Release|Win32
)- 因为我使用了
Debug
模式,所以我 link 在依赖项部分的cryptopp700\Win32\Output\Debug
中编辑了cryptlib.lib
。 - 同时添加头文件的依赖...
但是我在项目属性中忘记了一些东西:
最后,我将 Runtime Library 选项设置为 Multi-threaded Debug (/MTd)
这个选项在:
项目属性
配置属性
C/C++
代码生成
运行库
'byte' : ambiguous symbol error when using of Crypto++
由于 C++17 和 std::byte
,我们不得不将 byte
从全局命名空间移动到 CryptoPP
命名空间。更改发生在 Commit 00f9818b5d8e,这是 Crypto++ 6.0 版本的一部分。
Crypto++ 用于将 byte
放入全局命名空间以与 Microsoft SDK 兼容。如果没有全局字节,那么您将再次遇到 'byte' : ambiguous symbol error
。
您看到的错误是因为您使用了 using namespace CryptoPP;
和 Microsoft 套件仍然放置了 byte
在全局命名空间中。该错误在 Qt 下没有出现,因为 Qt 没有在全局命名空间中放置一个字节。
在 Crypto++ wiki 的 std::byte
中讨论了几种解决方法。
顺便说一句,Microsoft 套件代码在遇到 C++17 编译器和 std::byte
时会中断,因为 Microsoft 的全局 byte
。使用 Windows 套件时,您会遇到同样的错误。具有讽刺意味的是,Microsoft 员工编写了 C++ std::byte
。另见 PR0298R0, A byte type definition.
我知道这个答案与 Crypto++ 和 Windows SDK 没有直接关系,但我知道我在使用名为 Nan 的 Nodejs 插件库时试图找出同样的错误时发现了这个问题。我将这个答案放在这里是因为其他人可能 运行 遇到与我类似的问题。
一段时间以来,我在编译项目时没有遇到太多问题,但后来 运行 出现了与上述相同的错误。我没有在任何地方使用 byte
符号。有许多错误指向 Windows SDK 中的库,这也与作为错误地址的 cstddef
header 冲突。
我能够解决问题的方法是重新运行调整 headers 以便 Nan-related 内容(以及我自己的任何 header引用它的文件)在顶部,甚至在其他标准 C/C++ 库之上。完成后,错误消失了。
决定是最简单的。从您的代码中删除 'using namespace std' 并在每次操作之前使用命名空间 std:: 代替。