• Qt 5.15编译(MinGW)及集成Crypto++ 8.8.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加载工程进行编译。
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

      编译过程基本正常,将得到两个文件:cryptopp860.dlllibcryptopp860.a(请注意文件大小)。如图:
    编译出来的Crypto++动态库

    三、问题 & 对策

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

    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
    
    • 1
    • 2
    • 3
    • 4
    • 5

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

    四、集成引用动态链接库

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

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

      demo工程结构如下:
    在这里插入图片描述
      自此,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库的代码,在后续介绍。

  • 相关阅读:
    关于Electron框架应用的安全测试
    win10系统升级一段时间后,内存占用过高
    RTOS内功修炼记(十) | 深度解析RTOS内核上下文切换机制
    LeetCode笔记:Biweekly Contest 81
    net core天马行空系列-各大数据库快速批量插入数据方法汇总
    Django+Nginx+uWSGI+Supervisor实战
    浅谈代码语言的魅力
    方舟单机/管理员特殊物品指令代码大全
    获奖作品展示 | 2023嵌入式大赛AidLux系列作品精彩纷呈
    数据结构与算法(Java篇)笔记--Comparable接口
  • 原文地址:https://blog.csdn.net/paulorwys/article/details/132629655