错误:' GlobalRNG '未在此范围内声明
error: ‘GlobalRNG’ was not declared in this scope
我使用Crypto++来加密c++中的文件。我使用下面的代码。
它不包含头文件,所以我添加了我自己的:
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <fstream>
#include <cryptopp/cryptlib.h>
#include <cryptopp/sha.h>
#include <cryptopp/secblock.h>
#include <cryptopp/files.h>
#include <cryptopp/queue.h>
#include <cryptopp/hex.h>
#include <cryptopp/base64.h>
#include <cryptopp/filters.h>
#include <cryptopp/osrng.h>
#include <cryptopp/integer.h>
#include <cryptopp/dh.h>
#include <cryptopp/sha.h>
#include <cryptopp/modes.h>
#include <cryptopp/eax.h>
#include <cryptopp/tea.h>
#include <cryptopp/blowfish.h>
#include <cryptopp/pssr.h>
#include <cryptopp/rsa.h>
#include <cryptopp/nbtheory.h>
#include <cryptopp/eccrypto.h>
#include <cryptopp/oids.h>
#include <cryptopp/modes.h>
#include <cryptopp/gzip.h>
#include <cryptopp/blowfish.h>
#include <cryptopp/rsa.h>
#include <cryptopp/rng.h>
#include <cryptopp/cryptlib.h>
#include <cryptopp/filters.h>
#include <cryptopp/rdrand.h>
using namespace std;
using namespace CryptoPP;
但不幸的是,代码不起作用
表示没有声明GlobalRNG !
error: ‘GlobalRNG’ was not declared in this scope
我在谷歌上搜索了2天,一直在寻找解决方案,我发现这是一个错误,并修复了,但我有最新版本:5.6.3 !
所以我真的不知道为什么这个错误显示!
在5.6.3版本中 GlobalRNG
在文件validate.h
中定义为:
// Functions that need a RNG; uses AES inf CFB mode with Seed.
CryptoPP::RandomNumberGenerator & GlobalRNG();
只需添加以下内容:
#include <cryptopp/validate.h>
解决定义问题
GloablaRNG
是测试和基准测试的一部分。它不应该是库的一部分(即libcryptopp.a
或libcryptopp.so
)。如果你的程序抱怨缺少GloablaRNG
,那么这个库被一些测试和基准测试设备交叉污染了。
这些是用于测试和基准测试的文件。它们应该而不是包含在你的库或项目的构建中:
- validate.h
-
bench.h
-
test.cpp
- bench1.cpp, bench2.cpp
- validat0.cpp、validat1.cpp、validat2.cpp、validat3.cpp
- datatest.cpp, regtest.cpp, fipsalgt.cpp, dlltest.cpp
您可以自由地使用一个名为GlobalRNG()
的函数。以下是它在图书馆测试和基准测试设备中的使用情况。但是您可以考虑使用AutoSeededRandomPool
。AutoSeededRandomPool
是一个pgp风格的生成器,它的种子来自/dev/urandom
, /dev/srandom
, /dev/random
或Windows熵池。
声明validate.h
NAMESPACE_BEGIN(CryptoPP)
NAMESPACE_BEGIN(Test)
CryptoPP::RandomNumberGenerator & GlobalRNG();
NAMESPACE_END // Test
NAMESPACE_END // CryptoPP
定义test.cpp
NAMESPACE_BEGIN(CryptoPP)
NAMESPACE_BEGIN(Test)
ANONYMOUS_NAMESPACE_BEGIN
OFB_Mode<AES>::Encryption s_globalRNG;
NAMESPACE_END
RandomNumberGenerator & GlobalRNG()
{
return dynamic_cast<RandomNumberGenerator&>(s_globalRNG);
}
NAMESPACE_END // Test
NAMESPACE_END // CryptoPP
种子在test.cpp
// Don't do this in production because it creates a deterministic generator
OFB_Mode<AES>::Encryption& aesg = dynamic_cast<OFB_Mode<AES>::Encryption&>(Test::GlobalRNG());
aesg.SetKeyWithIV((byte *)seed.data(), 16, (byte *)seed.data());
多年来,很多人都有这个问题。在Crypto++ 6.0中,我们将GlobalRNG()
移到了Test
名称空间中。Test
是一个新的命名空间,我们希望Test::GlobalRNG()
将提供信号,在您的库构建或项目配置中出现错误。
也请参阅Issue 379,在CryptoPP命名空间中添加Test命名空间并提交73836e58a5f5c11c.
- 错误:未在此范围内声明'reverse'
- 错误:"imread"未在此范围内声明
- 未在此范围内声明错误 'xy'
- Socklen_t未在此范围内声明
- 错误:'[' 之前预期的非限定 id 和错误:'users'未在此范围内声明
- "Main"已在当前范围内声明
- c++ 变量在宏的扩展中没有在这个范围内声明
- C++ 在编译过程中 strtok 函数 Eclipse 说没有在范围内声明?
- 'num1'未在此范围内声明
- 如何找到在本地范围内声明的变量的地址?
- NT状态未在此范围内声明
- 变量未在此范围内声明 数组线性搜索
- 包含文件中的 Typdef "未在此范围内声明"
- 'ClassName'和'ClassInstance'未在此范围内声明
- C++ 中的类之间的数据重新循环 - 错误:'<class name>'未在此范围内声明
- 代码作为 C 文件工作,但不作为C++文件,错误:'__builtin_types_compatible_p'未在此范围内声明
- 如何修复错误:"vreinterpretq_u32_f64"未在此范围内声明 - 在Android上使用Eigen构建
- 如何修复C++中的"arrStud未在此范围内声明"错误
- 错误:"SHGetKnownFolderPath"未在此范围内声明
- 错误:'Sprite'未在此范围内声明