官网 https://www.cryptopp.com/release820.html 下载了Crypto++ 8.2
编译过程还是比较麻烦的。直接在QtCreator中是不能编译,但是参考1给出了生成pro的方式,用Qt提供的命令行工具进行下面的操作。看你安装的Qt编译器是MinGW还是VS版了。
cd \cryptopp820
qmake -project
它介绍2、3 操作我没有进行,原因是2已经被官方改掉了。我打算直接用QtCreator编译,就没删除。
它介绍的5操作 只需进行TEMPLATE = app 修改为 TEMPLATE = lib
TEMPLATE = lib
然后在QtCreator中打开pro文件,也可在这里修改上面提到 TEMPLATE = lib
当前MinGW版本,下面这句是没有必要加的。
LIBS += lws2_32
然后此时编译就是报错, 类似如下error
..\cryptopp820\aria_simd.cpp: In function 'void CryptoPP::ARIA_ProcessAndXorBlock_SSSE3(const byte*, CryptoPP::byte*, const byte*, CryptoPP::word32*)':
..\cryptopp820\aria_simd.cpp:156:76: warning: SSE vector return without SSE enabled changes the ABI [-Wpsabi]
const __m128i MASK = _mm_set_epi8(12,13,14,15, 8,9,10,11, 4,5,6,7, 0,1,2,3);
^
In file included from D:/Qt/Qt*****/Tools/mingw730_32/lib/gcc/i686-w64-mingw32/7.3.0/include/pmmintrin.h:31:0,
from D:/Qt/Qt*****/Tools/mingw730_32/lib/gcc/i686-w64-mingw32/7.3.0/include/tmmintrin.h:31,
from ..\cryptopp820\aria_simd.cpp:14:
D:/Qt/Qt*****/Tools/mingw730_32/lib/gcc/i686-w64-mingw32/7.3.0/include/emmintrin.h:615:1: error: inlining failed in call to always_inline '__m128i _mm_set_epi8(char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char)': target specific option mismatch
_mm_set_epi8 (char __q15, char __q14, char __q13, char __q12,
^~~~~~~~~~~~
..\cryptopp820\aria_simd.cpp:156:76: note: called from here
const __m128i MASK = _mm_set_epi8(12,13,14,15, 8,9,10,11, 4,5,6,7, 0,1,2,3);
参考3 加入一些参数,
然后 参考4 在inter的官网上查函数属于哪个指令集,
然后 参考2 再cryptopp6.0的介绍下,找到相应参数,后续自己也可以猜参数了
QMAKE_CXXFLAGS += "-msse4.2"
QMAKE_CXXFLAGS += "-msse4.1"
QMAKE_CXXFLAGS += "-msse3"
QMAKE_CXXFLAGS += "-msse2"
QMAKE_CXXFLAGS += "-mavx"
QMAKE_CXXFLAGS += "-mavx2"
QMAKE_CXXFLAGS += "-mpclmul"
QMAKE_CXXFLAGS += "-maes"
QMAKE_CXXFLAGS += "-msha"
后来发现,可以去掉三个,简化为
QMAKE_CXXFLAGS += "-msse4.2"
QMAKE_CXXFLAGS += "-mavx"
QMAKE_CXXFLAGS += "-mavx2"
QMAKE_CXXFLAGS += "-mpclmul"
QMAKE_CXXFLAGS += "-maes"
QMAKE_CXXFLAGS += "-msha"
然后又遇到了编译代码错误,仔细看了一下路径,发现都是TestPrograms中的内容,直接在pro文件中把相关目录下的都直接屏蔽,我们要的是动态库。
..\cryptopp820\TestPrograms\test_arm_aes.cxx:1:10: fatal error: arm_neon.h: No such file or directory
#include
^~~~~~~~~~~~
compilation terminated.
mingw32-make[1]: *** [Makefile.Release:5389: release/test_arm_aes.o] Error 1
..\cryptopp820\TestPrograms\test_arm_asimd.cxx:1:10: fatal error: arm_neon.h: No such file or directory
#include
^~~~~~~~~~~~
compilation terminated.
然后再进行编译,最终生成cryptopp820.dll和libcryptopp820.a 文件
再进行参考1中的第8步
8.之后编译完成后,我们需要拷贝生成的两个文件,这里有不一样的地方,我用的是mingw,所以要把.a文件拷贝到下面的路径,但是dll文件我没拷贝过去也能编译成功,为了避免问题,也拷贝到Tools\mingw\bin\ 下面了
D:\cryptopp820\release\libcryptopp552.a 拷贝到 \Tools\mingw\lib
D:\cryptopp820\release\cryptopp552.dll拷贝到\bin 以及 拷贝到\Tools\mingw\bin
这里
9.在
从D:\cryptopp820拷贝所有头文件header (.h)到
参考
1 https://www.cnblogs.com/AvalonRookie/articles/6937587.html
2 https://www.cryptopp.com/release600.html
3 https://blog.csdn.net/willib/article/details/52386087
4 https://software.intel.com/sites/landingpage/IntrinsicsGuide/