'byte':使用Crypto ++和Windows SDK时出现歧义符号错误

时间:2018-08-12 11:36:26

标签: c++ winapi encryption crypto++ cbc-mode

Visual Studio 2012 中,我尝试使用具有AES加密和CBC模式的Crypto ++库对文件进行加密,如下所示:

#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

顺便说一句,我链接了Crypto ++的.lib文件,因此我认为此错误不太可能。 最后一个errorCryptoPP::byte*相关吗?有什么解决办法吗?

2 个答案:

答案 0 :(得分:2)

  

'byte':使用Crypto ++时模棱两可的符号错误

由于C ++ 17和byte,我们不得不将CryptoPP从全局命名空间移到std::byte命名空间。更改发生在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的全局std::byte,当遇到C ++ 17编译器和byte时,Microsoft工具包代码将中断。使用Windows套件时,您将遇到相同的错误。具有讽刺意味的是,Microsoft员工编写了C ++ std::byte。另请参见PR0298R0, A byte type definition

答案 1 :(得分:0)

第一个问题通过将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++的每个正文都可能有此问题。

首先,我是从 visual studio 的波纹管链接下载库,其中包含.sln(VS解决方案):

  •   

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

  • 我通过 Batch Build 作为cryptlib项目在两种状态(Debug|Win32Release|Win32)中构建库。

  • 因为我使用的是Debug模式,所以我在依赖项部分的cryptlib.lib中链接了cryptopp700\Win32\Output\Debug
  • 还为头文件添加依赖项...

但是我忘记了项目属性:

最后,我将“运行时库”选项设置为多线程调试(/ MTd)

此选项位于:

  • 项目属性

  • 配置属性

  • C / C ++

  • 代码生成

  • 运行时库