Qt 5.15编译及集成Crypto++ 8.7.0笔记

一、背景

  为使用AES加密库(AES/CBC加解密),选用Crypto ++库(官网)。
  最新Crypto C++库依次为:8.8.0版本(2023-6-25)、8.7.0(2022-8-7)和8.6.0(2021-9-24)。
  网上实践的最新版本为8.6.0(2023-1-30),其中提到8.7.0使用有问题,但没有描述具体问题。

二、思路 & 尝试

  笔者在其他工程中用到过8.7.0版本(基于vcpkg,较重),但基于上述博主的提示,暂按下8.7.0版本而使用8.6.0。
  步骤(有调整和优化)如下:

 1. 下载crypto++ 8.6.0代码并unzip生成工程文件夹 → cryptopp860.zip 
 2. 设置环境变量PATH,添加qmake和mingw32-make到全局路径
    验证:qmake -v  位置:<QT_HOME>\5.15.2\mingw81_64\bin\qmake
     	 g++ -v    位置:<QT_HOME>\Tools\mingw810_64\bin\mingw32-make.exe
 3. 创建工程文件(cryptopp860.pro)
	qmake -project 
 4. 编辑pro文件(cryptopp860.pro)
	① TEMPLATE从【app】改为【lib】
	② 添加定义和标识
	DEFINES += CRYPTOPPLIB_LIBRARY
	QMAKE_CXXFLAGS += "-msse4.2"
	QMAKE_CXXFLAGS += "-mavx"
	QMAKE_CXXFLAGS += "-mavx2"
	QMAKE_CXXFLAGS += "-mpclmul"
	QMAKE_CXXFLAGS += "-maes"
	QMAKE_CXXFLAGS += "-msha"
	③ 剔除工程文件中的 TestPrograms/xxx 项
 5. 删除工程文件夹中的GNUmakefile文件
	del GNUmakefile 
 6. 编译
	qmake 
	mingw32-make all 或 mingw32-make -j4(多线程、编译得快) 或
	直接使用Qt Creator IDE加载工程进行编译。

  编译过程基本正常,将得到两个文件:cryptopp860.dlllibcryptopp860.a(请注意文件大小)。如图:
Qt 5.15编译及集成Crypto++ 8.7.0笔记_第1张图片

三、问题 & 对策

  但是在引用该动态链接库时出现异常,错误信息为:

Crypto++ DLL integrity check may fail. Expected module base address is 0x42900000, but module loaded at 0x6dd40000.
Crypto++ DLL in-memory integrity check failed. This may be caused by debug breakpoints or DLL relocation.
Crypto++ DLL integrity check failed. Actual MAC is: 93318****AE8FF3****41D4****ADECE3****F2D.

Exception caught: FileStore: error opening file for reading: TestData/usage.dat

  经调试是动态链接库加载的问题,其中【TestData/usage.dat】为测试用数据。
  怀疑夹杂了其他的测试代码······继续剔除无用的测试代码单元(并同时从工程文件中剔除):
  ① 所有含test(不区分大小写)的文件夹(TestData、TestPrograms、TestVectors)。
  ② 所有含test、bench、validat字样的.cpp和.h文件。
  ③ 可选,所有vc或vs工程文件(.vcxproj)
  再次编译得到的链接库信息如图:
Qt 5.15编译及集成Crypto++ 8.7.0笔记_第2张图片
  对比可见.a文件“清爽”了不少。再次集成,一切正常。

四、集成引用动态链接库

  在demo工程的.pro文件添加引用指令:

INCLUDEPATH += $$PWD/cryptopp870  # 引用工程中新建文件夹cryptopp870,用于存放头文件
LIBS += -L$$PWD -lcryptopp870     # .dll 和 .a 文件放置于工程文件夹中

  demo工程结构如下:
Qt 5.15编译及集成Crypto++ 8.7.0笔记_第3张图片
  自此,Qt编译及集成Crypto++ 8.7.0 的问题已解决。
  具体包装Crypto++ 8.7.0库的代码,在后续介绍。

四、结论

  虽然基于源代码编译得到动态库的方式比较“透明”,但也考验使用者对代码的掌控能力。
Crypto++ 8.7.0版本代码的编译问题结症在于混杂了测试、验证代码,从而导致动态库无法加载。

 相关下载:
  8.7.0版本的qt工程版本下载地址,该工程直接可使用Qt Creator IDE打开加载。
  8.7.0版本的动态链接库MinGW 64 bit下载地址,该动态链接库可直接集成到其他Qt工程。

 有关包装Crypto++ 8.7.0库的代码,在后续介绍。

你可能感兴趣的:(#,Qt,桌面开发,动态库,qt,Crypto++,动态库)