gpt4 book ai didi

c++ - 链接时未定义对 CryptoPP::AlignedAllocate 的引用

转载 作者:搜寻专家 更新时间:2023-10-31 00:12:15 27 4
gpt4 key购买 nike

我在 Windows 中编译 cryptopp 项目时遇到以下错误。

C:\Users\Sajith\AppData\Local\Temp\ccxq8O8x.o:aescbc.cpp:(.text$_ZN8CryptoPP20AllocatorWithCleanupIhLb1EE8allocateEjPKv[
__ZN8CryptoPP20AllocatorWithCleanupIhLb1EE8allocateEjPKv]+0x2e): undefined reference to `CryptoPP::AlignedAllocate(unsig
ned int)'
C:\Users\Sajith\AppData\Local\Temp\ccxq8O8x.o:aescbc.cpp:(.text$_ZN8CryptoPP20AllocatorWithCleanupIhLb1EE10deallocateEPv
j[__ZN8CryptoPP20AllocatorWithCleanupIhLb1EE10deallocateEPvj]+0x28): undefined reference to `CryptoPP::AlignedDeallocate
(void*)'
collect2.exe: error: ld returned 1 exit status


下面是我的编译命令:

mingw32-g++.exe -o .\aestest2.exe .\aescbc.cpp   -I "C:\cryptopp\Include" -L "C:\cryptopp\Lib" -lcryptopp


我的 libcryptopp.a 位于 C:\cryptopp\Lib
我试图找出 AlignedDeallocate 的声明位置,但我找不到。

引发此错误的程序部分如下:

try
{
cout << "plain text: " << plain << endl;

CBC_Mode< AES >::Encryption e;
e.SetKeyWithIV(key, sizeof(key), iv);

// The StreamTransformationFilter removes
// padding as required.
StringSource s(plain, true,
new StreamTransformationFilter(e,
new StringSink(cipher)
) // StreamTransformationFilter
); // StringSource

#if 0
StreamTransformationFilter filter(e);
filter.Put((const byte*)plain.data(), plain.size());
filter.MessageEnd();

const size_t ret = filter.MaxRetrievable();
cipher.resize(ret);
filter.Get((byte*)cipher.data(), cipher.size());
#endif
}
catch(const CryptoPP::Exception& e)
{
cerr << e.what() << endl;
exit(1);
}


建议表示赞赏!

最佳答案

AlignedAllocatemisc.h 中:

$ grep -I AlignedAllocate *
misc.cpp:void * AlignedAllocate(size_t size)
misc.h:CRYPTOPP_DLL void * CRYPTOPP_API AlignedAllocate(size_t size);
secblock.h: return (pointer)AlignedAllocate(n*sizeof(T));

和:

$ grep -R AlignedDeallocate *
misc.cpp:void AlignedDeallocate(void *p)
misc.h:CRYPTOPP_DLL void CRYPTOPP_API AlignedDeallocate(void *p);
secblock.h: return AlignedDeallocate(p);

但是,他们受到保护:

#if CRYPTOPP_BOOL_ALIGN16_ENABLED
CRYPTOPP_DLL void * CRYPTOPP_API AlignedAllocate(size_t size);
CRYPTOPP_DLL void CRYPTOPP_API AlignedDeallocate(void *p);
#endif

CRYPTOPP_BOOL_ALIGN16_ENABLEDconfig.h 中设置:

#if CRYPTOPP_BOOL_SSE2_INTRINSICS_AVAILABLE || CRYPTOPP_BOOL_SSE2_ASM_AVAILABLE || defined(CRYPTOPP_X64_MASM_AVAILABLE)
#define CRYPTOPP_BOOL_ALIGN16_ENABLED 1
#else
#define CRYPTOPP_BOOL_ALIGN16_ENABLED 0
#endif

在 Crypto++ 在内部做出选择后,您可以考虑将以下内容添加到 config.h:

#undef CRYPTOPP_BOOL_ALIGN16_ENABLED
#define CRYPTOPP_BOOL_ALIGN16_ENABLED 1

然后,重建库和您的程序。


可能发生的其他事情是:MinGW 正在禁用 MMX/SSE/SSE2 的机器上构建库。或者他们可能正在使用 g++ -mno-sse -mno-sse2 ...

然后,你有了一个 Shiny 的新 Intel 或 AMD,并且基于 g++ 启用的内容和 config.h 中的定义,你的程序需要 AlignedAllocateAlignedDeallocate 因为您的配置包括 MMX/SSE/SSE2...

这种情况在 config.h | Recommendations 中讨论在 Crypto++ 维基上。这就是为什么我们告诉发行版在 config.h 中启用和禁用某些东西,而不是从命令行。修改 config.h 确保发行版和用户程序大部分使用相同的设置。

如果是这种情况,那么您可以尝试:

export CXXFLAGS="-DNDEBUG -g2 -O2 -mno-sse -mno-sse2"
mingw32-g++.exe $CXXFLAGS -o .\aestest2.exe .\aescbc.cpp \
-I "C:\cryptopp\Include" -L "C:\cryptopp\Lib" -lcryptopp

有大量基于 MMX/SSE/SSE2 的级联定义;见config.h | Assembly Defines在维基上。由于禁用了 MMX/SSE/SSE2,您将获得 AES 的纯软件实现。它不会发挥应有的性能。

关于c++ - 链接时未定义对 CryptoPP::AlignedAllocate 的引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31002527/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com