当前位置: 首页 > news >正文

Qt 5.15编译(MinGW)及集成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\qmakeg++ -v    位置:<QT_HOME>\Tools\mingw810_64\bin\mingw32-make.exe3. 创建工程文件(cryptopp860.pro)qmake -project 4. 编辑pro文件(cryptopp860.pro)① TEMPLATE从【app】改为【lib】② 添加定义和标识DEFINES += CRYPTOPPLIB_LIBRARYQMAKE_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(请注意文件大小)。如图:
编译出来的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

  经调试是动态链接库加载的问题,其中【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 文件放置于工程文件夹中

  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库的代码,在后续介绍。

http://www.lryc.cn/news/155885.html

相关文章:

  • Qt 简单闹钟
  • 简单谈下Spring、Spring MVC和Spring Boot
  • 利用python进行视频下载并界面播放快速下载素材
  • [C++][pcl]pcl安装后测试代码3
  • 在WSL下使用makefile运行modelsim进行混合编译
  • idea 常用插件和常用快捷键 - 记录
  • IDEA报错:Plugin ‘org.springframework.boot:spring-boot-maven-plugin:‘ not found
  • C++——Vector:push_back和emplace_back的区别,测试写入1GB大数据时的性能差距
  • C/C++/QT/Python/MATLAB获取文件行数的示例
  • mysql的binlog參數詳解
  • 【SpringSecurity】九、Base64与JWT
  • Python的io模块
  • CSS---flex布局
  • java线程和go协程
  • JAVA 时间戳
  • 层次分析法(matlab实现)
  • python selenium 自动化登录页面
  • 【Linux】高级IO --- 多路转接,select,poll,epoll
  • anaconda navigator打不开,一直在loading画面
  • 【Java基础】深入理解反射、反射的应用(工厂模式、代理模式)
  • VUE 项目 nginx部署
  • Hashtable和HashMap、ConcurrentHashMap 之间的区别
  • 包管理工具--》npm的配置及使用(二)
  • 【Linux】多线程2——线程互斥与同步/多线程应用
  • Python中的函数式编程是什么?
  • 8月《中国数据库行业分析报告》已发布,聚焦数据仓库、首发【全球数据仓库产业图谱】
  • TikTok Shop|如何成为定邀卖家?
  • C++二级题目6
  • 南方科技大学博士研究生奖助学金,深圳大学
  • QT 使用信号与槽实现界面跳转