Qt 5.15集成Crypto++ 8.7.0(MSVC 2019)笔记
一、背景
笔者已介绍过在Qt 5.15.x中使用MinGW(8.10版本)编译并集成Crypto++ 8.7.0。
但是该编译出来的库(.a和.dll)不适用MSVC(2019版本)构建环境,需要重新编译(.lib或和.dll)。
二、思路 & 尝试
首先想到的是,在Qt MSVC环境下(VS Community 2019 版本 16.11.24)编译Crypto++ 8.7.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/cryptlibLIBS += -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.7.0静态库。fslib.dll则是动态库(同样使用MSVC编译)。
相关的引用和集成在工程文件(.pro)中体现如下:
INCLUDEPATH += $$PWD/cryptlib
INCLUDEPATH += $$PWD/fslibLIBS += -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.7.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构建)下载
相关文章:
Qt 5.15集成Crypto++ 8.7.0(MSVC 2019)笔记
一、背景 笔者已介绍过在Qt 5.15.x中使用MinGW(8.10版本)编译并集成Crypto 8.7.0。 但是该编译出来的库(.a和.dll)不适用MSVC(2019版本)构建环境,需要重新编译(.lib或和.dll…...
LeetCode——贪心篇(一)
刷题顺序及思路来源于代码随想录,网站地址:https://programmercarl.com 目录 455. 分发饼干 376. 摆动序列 53. 最大子数组和 122. 买卖股票的最佳时机 II 55. 跳跃游戏 45. 跳跃游戏 II 1005. K 次取反后最大化的数组和 455. 分发饼干 假设你是…...
2023高教社杯 国赛数学建模C题思路 - 蔬菜类商品的自动定价与补货决策
1 赛题 在生鲜商超中,一般蔬菜类商品的保鲜期都比较短,且品相随销售时间的增加而变差, 大部分品种如当日未售出,隔日就无法再售。因此, 商超通常会根据各商品的历史销售和需 求情况每天进行补货。 由于商超销售的蔬菜…...
【理解线性代数】(四)线性运算的推广与矩阵基础
1. 数值加法和乘法 数值加法与乘法,是小学数学课程中的基本数学运算。例如: 加法:112 乘法:2*24 在这个知识层次下,运算的基本单位是数字。 2. 从数值到向量 数值加法,可以看作一维空间中的向量加法&…...
C# 什么是继承和派生
C# 什么是继承和派生 在 C# 中,继承(Inheritance)是一种机制,它允许一个类(子类)从另一个类(父类)中继承属性和方法。这种关系使得子类可以重用父类的代码,同时可以在子…...
无涯教程-JavaScript - HEX2BIN函数
描述 HEX2BIN函数将十六进制数转换为二进制数。 语法 HEX2BIN (number, [places])争论 Argument描述Required/Optionalnumber 您要转换的十六进制数。 数字不能超过10个字符(40位)。数字的最高有效位是符号位(从右数第40位)。其余的39位是幅度位。 负数使用二进制补码表示。…...
前端面试0906
// 请给出输出结果 function foo(){ console.log(a); } function bar(){ var a 3; console.log(this.a); foo(); } var a 2; bar(); 2 2 // 请从下面的问题中挑选3道进行回答 1. 防抖和节流分别是什么,一般用在什么场景? 防抖(Debounc…...
OceanBase社区版4.x核心技术解密
数字化时代,各行各业的数据量呈现爆发式增长,对于海量数据价值的挖掘和应用,正成为推动创新的主要力量,与此同时,数据计算复杂度正在提升。在此背景下,对于数据处理的基石数据库而言,正面临市场…...
快速安装k8s
RKE安装方式 官方文章资源地址 https://rke.docs.rancher.com/installation rke工具下载地址(arm,amd,windows都有) https://github.com/rancher/rke/releases x86的用amd64下载rke工具 https://github.com/rancher/rke/releases/download/v1.4.8/rke_li…...
[FFmpeg] 常用ffmpeg命令
去水印 ffmpeg -i water.jpeg -strict -2 -vf delogox300:y250:w56:h18:show0 no_water.jpeg 打时间戳 ffmpeg -i perf_60Hz_Raw.mp4 -vf "drawtextfontsize160:fontcolorred:text%{pts\:hms}" -c:v libx264 -an -f mp4 perf_output.mp4 -y ffmpeg -i perf_8k.mp4 -v…...
代码随想录训练营第五十七天|647. 回文子串、516.最长回文子序列
647. 回文子串 题目链接/文章讲解/视频讲解:代码随想录 1.代码展示 //647.回文子串 int countSubstrings(string s) {//step1 构建dp数组,明确dp数组的含义,dp[i][j]的含义是在下标为i和j区间内的字串是否为回文串vector<vector<bool&…...
对线程池设置做压测
线程池代码 Configuration public class ThreadPoolConfig {// 核心线程池大小private int corePoolSize 24;// 最大可创建的线程数private int maxPoolSize 25;// 队列最大长度private int queueCapacity 100;// 线程池维护线程所允许的空闲时间private int keepAliveSeco…...
【网络通信 -- WebRTC】项目实战记录 -- mediasoup android 适配 webrtc m94
【网络通信 -- WebRTC】项目实战记录 -- mediasoup android 适配 webrtc m94 【1】下载并配置 depot_tools 下载 depot_tools git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git编辑 ~/.bashrc 将 depot_tools 添加到路径中 vim ~/.bashrc export…...
【力扣周赛】第 357 场周赛(⭐反悔贪心)
文章目录 竞赛链接Q1:6925. 故障键盘解法1——直接模拟解法2——双端队列 Q2:6953. 判断是否能拆分数组(贪心)Q3:2812. 找出最安全路径⭐解法1——多源BFS瓶颈路模型?解法2——多源BFS 倒序枚举答案 并查…...
css重置
css 重置 CSS 重置的主要目标是确保浏览器之间的一致性,并撤消所有默认样式,创建一个空白板。 如今,主流浏览器都实现了css规范,在布局或间距方面没有太大差异。但是通过自定义 CSS 重置,也可以改善用户体验和提高开…...
tcpdump相关
Linux内核角度分析tcpdump原理(一)Linux内核角度分析tcpdump原理(二)...
MFC新建内部消息
提示:记录一下MFC新建内部消息的成功过程 文章目录 前言一、pandas是什么?二、使用步骤 1.引入库2.读入数据总结 前言 先说一下基本情况,因为要在mapview上增加一个显示加载时间的功能。然后发现是要等加载完再显示时间,显示在主…...
linux查找目录
要在Linux中查找目录,可以使用find命令。下面是查询目录的几个示例: 1,查找当前目录下所有子目录: find . -type d 2,在指定路径下查找目录: find /path/to/directory -type d 3,查找以特定名称开头的目录: find . -t…...
机器学习:可解释学习
文章目录 可解释学习为什么需要可解释机器学习可解释还是强模型可解释学习的目标可解释机器学习Local ExplanationGlobal Explanation 可解释学习 神马汉斯,只有在有人看的时候能够答对。 为什么需要可解释机器学习 贷款,医疗需要给出理由,让…...
UE5- c++ websocket里实现调用player里的方法
# UGameInstance里直接调用 获取到引用了,就可以自然的调用。忽略 # UGameInstance里间接调用,通过代理调用 前置已经添加了websocket,具体步骤参考,链接在UWebSocketGameInstance.h里新增代理,并在链接成功后进行绑定。 #pragma…...
浏览器访问 AWS ECS 上部署的 Docker 容器(监听 80 端口)
✅ 一、ECS 服务配置 Dockerfile 确保监听 80 端口 EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]或 EXPOSE 80 CMD ["python3", "-m", "http.server", "80"]任务定义(Task Definition&…...
零门槛NAS搭建:WinNAS如何让普通电脑秒变私有云?
一、核心优势:专为Windows用户设计的极简NAS WinNAS由深圳耘想存储科技开发,是一款收费低廉但功能全面的Windows NAS工具,主打“无学习成本部署” 。与其他NAS软件相比,其优势在于: 无需硬件改造:将任意W…...
Java如何权衡是使用无序的数组还是有序的数组
在 Java 中,选择有序数组还是无序数组取决于具体场景的性能需求与操作特点。以下是关键权衡因素及决策指南: ⚖️ 核心权衡维度 维度有序数组无序数组查询性能二分查找 O(log n) ✅线性扫描 O(n) ❌插入/删除需移位维护顺序 O(n) ❌直接操作尾部 O(1) ✅内存开销与无序数组相…...
家政维修平台实战20:权限设计
目录 1 获取工人信息2 搭建工人入口3 权限判断总结 目前我们已经搭建好了基础的用户体系,主要是分成几个表,用户表我们是记录用户的基础信息,包括手机、昵称、头像。而工人和员工各有各的表。那么就有一个问题,不同的角色…...
Java多线程实现之Callable接口深度解析
Java多线程实现之Callable接口深度解析 一、Callable接口概述1.1 接口定义1.2 与Runnable接口的对比1.3 Future接口与FutureTask类 二、Callable接口的基本使用方法2.1 传统方式实现Callable接口2.2 使用Lambda表达式简化Callable实现2.3 使用FutureTask类执行Callable任务 三、…...
Nginx server_name 配置说明
Nginx 是一个高性能的反向代理和负载均衡服务器,其核心配置之一是 server 块中的 server_name 指令。server_name 决定了 Nginx 如何根据客户端请求的 Host 头匹配对应的虚拟主机(Virtual Host)。 1. 简介 Nginx 使用 server_name 指令来确定…...
Redis数据倾斜问题解决
Redis 数据倾斜问题解析与解决方案 什么是 Redis 数据倾斜 Redis 数据倾斜指的是在 Redis 集群中,部分节点存储的数据量或访问量远高于其他节点,导致这些节点负载过高,影响整体性能。 数据倾斜的主要表现 部分节点内存使用率远高于其他节…...
DeepSeek 技术赋能无人农场协同作业:用 AI 重构农田管理 “神经网”
目录 一、引言二、DeepSeek 技术大揭秘2.1 核心架构解析2.2 关键技术剖析 三、智能农业无人农场协同作业现状3.1 发展现状概述3.2 协同作业模式介绍 四、DeepSeek 的 “农场奇妙游”4.1 数据处理与分析4.2 作物生长监测与预测4.3 病虫害防治4.4 农机协同作业调度 五、实际案例大…...
JVM虚拟机:内存结构、垃圾回收、性能优化
1、JVM虚拟机的简介 Java 虚拟机(Java Virtual Machine 简称:JVM)是运行所有 Java 程序的抽象计算机,是 Java 语言的运行环境,实现了 Java 程序的跨平台特性。JVM 屏蔽了与具体操作系统平台相关的信息,使得 Java 程序只需生成在 JVM 上运行的目标代码(字节码),就可以…...
08. C#入门系列【类的基本概念】:开启编程世界的奇妙冒险
C#入门系列【类的基本概念】:开启编程世界的奇妙冒险 嘿,各位编程小白探险家!欢迎来到 C# 的奇幻大陆!今天咱们要深入探索这片大陆上至关重要的 “建筑”—— 类!别害怕,跟着我,保准让你轻松搞…...
