cryptopp820在QtCreator下的编译

官网 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 <arm_neon.h>
^~~~~~~~~~~~
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 <arm_neon.h>
^~~~~~~~~~~~
compilation terminated.

然后再进行编译,最终生成cryptopp820.dll和libcryptopp820.a 文件

再进行参考1中的第8步

8.之后编译完成后,我们需要拷贝生成的两个文件,这里有不一样的地方,我用的是mingw,所以要把.a文件拷贝到下面的路径,但是dll文件我没拷贝过去也能编译成功,为了避免问题,也拷贝到Tools\mingw\bin\ 下面了

D:\cryptopp\release\libcryptopp552.a 拷贝到 <Qt dir>\Tools\mingw\lib
D:\cryptopp552\release\cryptopp552.dll拷贝到<Qt dir>\bin 以及 拷贝到<Qt dir>\Tools\mingw\bin

这里<Qt dir>代表你自己的Qt安装目录

9.在<Qt dir>\include下创建一个名字为cryptopp的文件夹

从D:\cryptopp820拷贝所有头文件header (.h)到 <Qt dir>\include\cryptopp.

参考

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/

发布了14 篇原创文章 · 获赞 4 · 访问量 7336

猜你喜欢

转载自blog.csdn.net/yxmlhc/article/details/104070304