Qt 5.15集成Crypto++ 8.8.0(MSVC 2019)笔记

news2024/9/21 22:52:36
一、背景

  笔者已介绍过在Qt 5.15.x中使用MinGW(8.10版本)编译并集成Crypto++ 8.8.0。
但是该编译出来的库(.a和.dll)不适用MSVC(2019版本)构建环境,需要重新编译(.lib或和.dll)。

二、思路 & 尝试

  首先想到的是,在Qt MSVC环境下(VS Community 2019 版本 16.11.24)编译Crypto++ 8.8.0源代码,以得到相关库。
  结果是大碰壁:

gcm.obj : error LNK2019: 无法解析的外部符号 GCM_AuthenticateBlocks_2K_SSE2,函数 "protected: virtual unsigned __int64 __cdecl CryptoPP::GCM_Base::AuthenticateBlocks(unsigned char const *,unsigned __int64)" (?AuthenticateBlocks@GCM_Base@CryptoPP@@MEAA_KPEBE_K@Z) 中引用了该符号
gcm.obj : error LNK2019: 无法解析的外部符号 GCM_AuthenticateBlocks_64K_SSE2,函数 "protected: virtual unsigned __int64 __cdecl CryptoPP::GCM_Base::AuthenticateBlocks(unsigned char const *,unsigned __int64)" (?AuthenticateBlocks@GCM_Base@CryptoPP@@MEAA_KPEBE_K@Z) 中引用了该符号
integer.obj : error LNK2019: 无法解析的外部符号 Baseline_Add,函数 "class CryptoPP::Integer __cdecl CryptoPP::StringToInteger<char>(char const *,enum CryptoPP::ByteOrder)" (??$StringToInteger@D@CryptoPP@@YA?AVInteger@0@PEBDW4ByteOrder@0@@Z) 中引用了该符号
integer.obj : error LNK2019: 无法解析的外部符号 Baseline_Sub,函数 "public: virtual class CryptoPP::Integer & __cdecl CryptoPP::ModularArithmetic::Accumulate(class CryptoPP::Integer &,class CryptoPP::Integer const &)const " (?Accumulate@ModularArithmetic@CryptoPP@@UEBAAEAVInteger@2@AEAV32@AEBV32@@Z) 中引用了该符号
...

  提示找不到目标函数,搜索代码发现,这些函数都存在于汇编代码块中(.asm),在C++代码中声明。
  接着捣鼓,即便放开了定义,允许进入汇编代码,但编译还是无法pass:MSVC的工具链无法编译汇编代码。

xx\gcm.cpp:579: error: C4235: 使用了非标准扩展: 不支持在此结构上使用“__asm”关键字
xx\gcm.cpp:579: error: C2065: “mov”: 未声明的标识符
xx\gcm.cpp:579: error: C2146: 语法错误: 缺少“;”(在标识符“rcx”的前面)
xx\gcm.cpp:579: error: C2065: “rcx”: 未声明的标识符
xx\gcm.cpp:579: error: C2143: 语法错误: 缺少“;”(在“}”的前面)
xx\gcm.cpp:580: error: C4235: 使用了非标准扩展: 不支持在此结构上使用“__asm”关键字

  看来,直接使用Qt MSVC构建的路径行不通了(至少不容易)。那就只能走用VS构建路了。
  出乎意料,使用Visual Studio 2019非常顺利地编译出静态和动态库。不过很快发现一个问题:动态库文件太小(1,646 kB),调查发现工程(cyrdll)中所包含的源文件也不完整。。(郁闷了),倒是静态库(cryptlib)看似比较靠谱。
  那就在Qt中使用静态库吧。。引用方式和动态库一样。demo工程文件(.pro)引用cryptlib库部分如下:

INCLUDEPATH += $$PWD/cryptlib

LIBS += -L$$PWD -lcryptlib

  结果编译依然报错,但是错得没有那么离谱了:

cryptlib.lib(cryptlib.obj):-1: error: LNK2038: 检测到“RuntimeLibrary”的不匹配项: 值“MT_StaticRelease”不匹配值“MD_DynamicRelease”(fscryptoutil.obj 中)
cryptlib.lib(filters.obj):-1: error: LNK2038: 检测到“RuntimeLibrary”的不匹配项: 值“MT_StaticRelease”不匹配值“MD_DynamicRelease”(fscryptoutil.obj 中)

  经搜索,定位该问题为运行时库的设置问题:Visual Studio默认的是MT(多线程),而Qt MSVC要的是MD(多线程DLL)。
  以下是VS IDE中,cryptlib工程有关运行库的设置页面:
在这里插入图片描述
  在VS IDE中按照调整后的运行库选项,重新编译。集成OK。

三、集成

  Qt Demo工程环境:qmake + MSVC 2019 + Release + x64。如图:
在这里插入图片描述
  其中cryptlib.lib即为Crypto++ 8.8.0静态库。fslib.dll则是动态库(同样使用MSVC编译)。
  相关的引用和集成在工程文件(.pro)中体现如下:

INCLUDEPATH += $$PWD/cryptlib
INCLUDEPATH += $$PWD/fslib

LIBS += -L$$PWD -lcryptlib
LIBS += -lfslib
四、结论

(1)Crypto++源代码编译ok的两种环境:

  • Qt qmake (MinGW)可以编译出动态库,参见:Qt 5.15编译(MinGW)及集成Crypto++ 8.7.0笔记。
  • Visual Studio 2019 可以编译出静态库(解决方案中的cryptlib工程),但需要调整运行库类型从MT→MD。

(2)Qt的集成,库使用什么环境构建,则可执行模块亦使用对应的构建环境:

  • Qt qmake (MinGW Release x64) → qmake (MinGW Release x64)
  • VS 2019 Release x64 → qmake (MSVC 2019 Release x64)

(3)遗留问题:CMake + MSVC构建环境的尝试。

五、资源or参考链接:

(1)8.7.0版本的静态链接库MSVC 64 bit下载地址,该动态链接库可直接集成到其他Qt qmake(MSVC)工程。
(2)Qt 5.15编译(MinGW)及集成Crypto++ 8.8.0笔记
(3)Crypto++ 8.7.0 Qt工程(Qt 5.15.x MinGW(8.10) 64-bit)下载
(4)Crypto++ 8.7.0动态库(用于Qt 5.15及以上版本,MinGW8.10 x64构建)下载

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/987141.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++11新特性② | 左值、左值引用、右值与右值引用

目录 1、引言 2、值类别及相关概念 3、左值、右值 4、左值引用、右值引用 5、移动语义 5.1、为什么需要移动语义 5.2、移动语义定义 5.3、转移构造函数 5.4、转移赋值函数 6、标准库函数 std::move 7、完美转发 std::forward VC常用功能开发汇总&#xff08;专栏文章…

Mybatis 使用typeHandler自定义类型转换

之前我们介绍了使用Mybatis完成数据的增删改查操作&#xff1b;本篇我们介绍使用Mybatis提供的typeHandler自定义类型转换。 如果您对Mybatis的增删改查操作不太了解&#xff0c;可以参考&#xff1a; Mybatis 查询数据https://blog.csdn.net/m1729339749/article/details/13…

explain 实战-----查看hive sql执行计划

目录 1.join/left join/full join 语句会过滤关联字段 null 的值吗&#xff1f; &#xff08;1&#xff09;join &#xff08;2&#xff09; left join /full join 2.group by 分组语句会进行排序吗&#xff1f; 1.join/left join/full join 语句会过滤关联字段 null 的值吗…

Qt 5.15编译(MinGW)及集成Crypto++ 8.8.0笔记

一、背景 为使用AES加密库&#xff08;AES/CBC加解密&#xff09;&#xff0c;选用Crypto 库&#xff08;官网&#xff09;。   最新Crypto C库依次为&#xff1a;8.8.0版本&#xff08;2023-6-25&#xff09;、8.7.0&#xff08;2022-8-7&#xff09;和8.6.0&#xff08;202…

绘图系统三:支持散点图、极坐标和子图绘制

文章目录 新增散点图绘制绑定与回调极坐标功能子图绘制功能源代码 &#x1f4c8;一 三维绘图系统&#x1f4c8;二 多图绘制系统 新增散点图绘制 同一坐标系中绘制多个图像是很常见的需求&#xff0c;比如数据拟合的时候&#xff0c;用散点图表示原始数据&#xff0c;用曲线图…

vue3 webpack打包流程及安装 (1)

npm run build 也可以打包 如果没有特殊需求 可以使用 效果其实是差不多的 --------------------------------------------------------------------------------------------------------------------------------- webpack网址 &#xff1a; 起步 | webpack 中文文档 (docsc…

记录docker 部署nessus

1、开启容器 docker run -itd --nameramisec_nessus -p 8834:8834 ramisec/nessus 2、登录 &#xff1a;注意是https https://ip8843 3、修改admin密码 #进入容器 docker exec -it ramisec_nessus /bin/bash#列出用户名 /opt/nessus/sbin/nessuscli lsuser#修改密码&a…

(html+CSS)垂直居中

line-height 设置文字行高等于父元素的高度 vertical-align 用于设置一个元素的垂直对齐方式&#xff0c;但是它只针对于行内元素或者行内块元素有效。 属性值说明baseline默认&#xff0c;元素放置在父元素的基线上top把元素的顶端与行中最高元素的顶端对齐middle把此元素…

递归算法学习——黄金矿工,不同路径III

目录 ​编辑 一&#xff0c;黄金矿工 1.题意 2.题目分析 3.题目接口 4.解题思路及代码 二&#xff0c;不同路径III 1.题意 2.解释 3.题目接口 4.解题思路及代码 一&#xff0c;黄金矿工 1.题意 你要开发一座金矿&#xff0c;地质勘测学家已经探明了这座金矿中的资源…

YMatrix 5.0 与天翼云完成产品兼容性认证

近日&#xff0c;北京四维纵横数据技术有限公司与天翼云宣布完成产品兼容性认证。经过双方严格的测试验证&#xff0c;超融合数据库 YMatrix 5.0 与天翼云兼容性良好&#xff0c;可基于天翼云稳定运行。 数据库系统作为基础软件的核心&#xff0c;自主可控势在必行。在此背景下…

项目(智慧教室)第一部分:cubemx配置,工程文件的移植,触摸屏的检测,项目bug说明

第一章&#xff1a;需求与配置 一。项目需求 二。实现外设控制 注意&#xff1a; 先配置引脚&#xff0c;再配置外设。否则会出现一些不可预料的问题 1.时钟&#xff0c;串口&#xff0c;灯&#xff0c;蜂鸣器配置 &#xff08;1&#xff09;RCC配置为外部时钟&#xff0c;修…

Android 开发小贴士

Android 开发小贴士 Unable to merge dex 原因&#xff1a; 1. 包引用重复 2. 方法数超限 3. 或者几个库之间有重复代码块(特别是在整理module时容易犯) 解决&#xff1a; 1. app的build.gradle中 // 1. 添加配置 defaultConfig {......multiDexEnabled true }// 2. 清除缓…

pico学习进程记录已经开发项目

Pico pin脚定义 Pico 运行准备 下载uf2文件 https://pico.org.cn/ &#xff08;注意运行micropython的文件和运行c/c的不一样&#xff09; 装载uf2文件&#xff1a;按住pico的按键&#xff0c;然后通过micro usb连接电脑&#xff08;注意&#xff1a;如果用的线材&#xff0c;…

菜鸟教程《Python 3 教程》笔记(19):错误与异常

菜鸟教程《Python 3 教程》笔记&#xff08;19&#xff09; 19 错误和异常19.1 assert&#xff08;断言&#xff09;19.2 异常处理19.2.1 try/except19.2.2 try/except...else19.2.3 try-finally 语句 19.3 抛出异常19.4 用户自定义异常19.5 清理行为19.5.1 定义清理行为19.5.2…

生信分析Python实战练习 6 | 视频24

开源生信 Python教程 生信专用简明 Python 文字和视频教程 源码在&#xff1a;https://github.com/Tong-Chen/Bioinfo_course_python 目录 背景介绍 编程开篇为什么学习Python如何安装Python如何运行Python命令和脚本使用什么编辑器写Python脚本Python程序事例Python基本语法 数…

HTTP代理协议原理分析

HTTP代理协议是一种常见的网络协议&#xff0c;它可以在网络中传递HTTP协议的请求和响应。本文将介绍HTTP代理协议的分析和原理&#xff0c;包括HTTP代理的工作流程、HTTP代理的请求和响应格式、HTTP代理的优缺点等方面。 一、HTTP代理的工作流程 HTTP代理的工作流程如下&#…

OmniGraffle Pro for Mac 中文正式版(附注册码) 苹果电脑 思维导图软件

OmniGraffle Pro是OmniGraffle的高级版本&#xff0c;它提供了更多的功能和工具&#xff0c;可以帮助用户创建更为复杂和高级的图表和流程图。OmniGraffle Pro支持自定义形状、图形、线条和箭头等&#xff0c;可以让用户创建出更加精细的图表。此外&#xff0c;OmniGraffle Pro…

centos7做软连接及注意事项

centos7做软连接及注意事项 小白教程&#xff0c;一看就会&#xff0c;一做就成。 1.要求 /data/upload/目录软连接到/data/ydoa/webapps/defaultroot下&#xff0c;命名为upload 2.开始操作 #先进入到/data/ydoa/webapps/defaultroot cd /data/ydoa/webapps/defaultroot #…

调试心得:通过观察正常的程序行为来识别Bug

有时候&#xff0c;当我调试一个问题的时候&#xff0c;我会特意忽略掉某些线程。 这个时候&#xff0c;有人就问了&#xff1a;”这些线程是干什么的&#xff1f;你为什么知道要忽略它们&#xff1f;” 我的回答是&#xff1a;我也不清楚这些线程是干啥的&#xff0c;但是无论…

Spring MVC的常用注解及用法

Spring MVC的执行流程&#xff1a; 1.用户的请求首先到Controller 2.Controller将请求转发给Model 3.Model处理业务并将数据结果给Controller 4.Controller会将数据给View引擎 5.View转换数据生成最终的页面给用户。 常用注解&#xff1a; 1.requestMapping&#xff1a;…