'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 文件,所以我认为这个错误不太可能。 最后 errorCryptoPP::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 解决方案):

  • https://www.cryptopp.com/#download

  • 我通过 Batch Build 将库构建为 cryptlib 项目,处于两种状态(Debug|Win32Release|Win32

  • 因为我使用了 Debug 模式,所以我 link 在依赖项部分的 cryptopp700\Win32\Output\Debug 中编辑了 cryptlib.lib
  • 同时添加头文件的依赖...

但是我在项目属性中忘记了一些东西:

最后,我将 Runtime Library 选项设置为 Mu​​lti-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:: 代替。