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

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&#xff08;8.10版本&#xff09;编译并集成Crypto 8.7.0。 但是该编译出来的库&#xff08;.a和.dll&#xff09;不适用MSVC&#xff08;2019版本&#xff09;构建环境&#xff0c;需要重新编译&#xff08;.lib或和.dll&#xf…...

LeetCode——贪心篇(一)

刷题顺序及思路来源于代码随想录&#xff0c;网站地址&#xff1a;https://programmercarl.com 目录 455. 分发饼干 376. 摆动序列 53. 最大子数组和 122. 买卖股票的最佳时机 II 55. 跳跃游戏 45. 跳跃游戏 II 1005. K 次取反后最大化的数组和 455. 分发饼干 假设你是…...

2023高教社杯 国赛数学建模C题思路 - 蔬菜类商品的自动定价与补货决策

1 赛题 在生鲜商超中&#xff0c;一般蔬菜类商品的保鲜期都比较短&#xff0c;且品相随销售时间的增加而变差&#xff0c; 大部分品种如当日未售出&#xff0c;隔日就无法再售。因此&#xff0c; 商超通常会根据各商品的历史销售和需 求情况每天进行补货。 由于商超销售的蔬菜…...

【理解线性代数】(四)线性运算的推广与矩阵基础

1. 数值加法和乘法 数值加法与乘法&#xff0c;是小学数学课程中的基本数学运算。例如&#xff1a; 加法&#xff1a;112 乘法&#xff1a;2*24 在这个知识层次下&#xff0c;运算的基本单位是数字。 2. 从数值到向量 数值加法&#xff0c;可以看作一维空间中的向量加法&…...

C# 什么是继承和派生

C# 什么是继承和派生 在 C# 中&#xff0c;继承&#xff08;Inheritance&#xff09;是一种机制&#xff0c;它允许一个类&#xff08;子类&#xff09;从另一个类&#xff08;父类&#xff09;中继承属性和方法。这种关系使得子类可以重用父类的代码&#xff0c;同时可以在子…...

无涯教程-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. 防抖和节流分别是什么&#xff0c;一般用在什么场景&#xff1f; 防抖&#xff08;Debounc…...

OceanBase社区版4.x核心技术解密

数字化时代&#xff0c;各行各业的数据量呈现爆发式增长&#xff0c;对于海量数据价值的挖掘和应用&#xff0c;正成为推动创新的主要力量&#xff0c;与此同时&#xff0c;数据计算复杂度正在提升。在此背景下&#xff0c;对于数据处理的基石数据库而言&#xff0c;正面临市场…...

快速安装k8s

RKE安装方式 官方文章资源地址 https://rke.docs.rancher.com/installation rke工具下载地址&#xff08;arm,amd,windows都有&#xff09; 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. 回文子串 题目链接/文章讲解/视频讲解&#xff1a;代码随想录 1.代码展示 //647.回文子串 int countSubstrings(string s) {//step1 构建dp数组&#xff0c;明确dp数组的含义&#xff0c;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&#xff1a;6925. 故障键盘解法1——直接模拟解法2——双端队列 Q2&#xff1a;6953. 判断是否能拆分数组&#xff08;贪心&#xff09;Q3&#xff1a;2812. 找出最安全路径⭐解法1——多源BFS瓶颈路模型&#xff1f;解法2——多源BFS 倒序枚举答案 并查…...

css重置

css 重置 CSS 重置的主要目标是确保浏览器之间的一致性&#xff0c;并撤消所有默认样式&#xff0c;创建一个空白板。 如今&#xff0c;主流浏览器都实现了css规范&#xff0c;在布局或间距方面没有太大差异。但是通过自定义 CSS 重置&#xff0c;也可以改善用户体验和提高开…...

tcpdump相关

Linux内核角度分析tcpdump原理&#xff08;一&#xff09;Linux内核角度分析tcpdump原理&#xff08;二&#xff09;...

MFC新建内部消息

提示&#xff1a;记录一下MFC新建内部消息的成功过程 文章目录 前言一、pandas是什么&#xff1f;二、使用步骤 1.引入库2.读入数据总结 前言 先说一下基本情况&#xff0c;因为要在mapview上增加一个显示加载时间的功能。然后发现是要等加载完再显示时间&#xff0c;显示在主…...

linux查找目录

要在Linux中查找目录&#xff0c;可以使用find命令。下面是查询目录的几个示例&#xff1a; 1,查找当前目录下所有子目录&#xff1a; find . -type d 2,在指定路径下查找目录&#xff1a; find /path/to/directory -type d 3,查找以特定名称开头的目录&#xff1a; find . -t…...

机器学习:可解释学习

文章目录 可解释学习为什么需要可解释机器学习可解释还是强模型可解释学习的目标可解释机器学习Local ExplanationGlobal Explanation 可解释学习 神马汉斯&#xff0c;只有在有人看的时候能够答对。 为什么需要可解释机器学习 贷款&#xff0c;医疗需要给出理由&#xff0c;让…...

UE5- c++ websocket里实现调用player里的方法

# UGameInstance里直接调用 获取到引用了&#xff0c;就可以自然的调用。忽略 # UGameInstance里间接调用&#xff0c;通过代理调用 前置已经添加了websocket,具体步骤参考&#xff0c;链接在UWebSocketGameInstance.h里新增代理&#xff0c;并在链接成功后进行绑定。 #pragma…...

Reachability.swift终极指南:现代iOS应用网络状态管理完全解析

Reachability.swift终极指南&#xff1a;现代iOS应用网络状态管理完全解析 【免费下载链接】Reachability.swift Replacement for Apples Reachability re-written in Swift with closures 项目地址: https://gitcode.com/gh_mirrors/re/Reachability.swift Reachabilit…...

如何快速掌握Claude技能:面向初学者的完整指南与实用工具集

如何快速掌握Claude技能&#xff1a;面向初学者的完整指南与实用工具集 【免费下载链接】awesome-claude-skills A curated list of awesome Claude Skills, resources, and tools for customizing Claude AI workflows 项目地址: https://gitcode.com/GitHub_Trending/aw/aw…...

OpenClaw成本分析:GLM-4.7-Flash长期运行的Token消耗与优化

OpenClaw成本分析&#xff1a;GLM-4.7-Flash长期运行的Token消耗与优化 1. 为什么需要关注OpenClaw的Token消耗&#xff1f; 去年冬天&#xff0c;当我第一次在本地部署OpenClaw对接GLM-4.7-Flash模型时&#xff0c;完全没意识到这个"小助手"会成为我每月账单上的&…...

InstructPix2Pix真实体验:保留原图结构的智能修图,到底有多好用?

InstructPix2Pix真实体验&#xff1a;保留原图结构的智能修图&#xff0c;到底有多好用&#xff1f; 1. 颠覆传统的修图体验 作为一名长期与图像处理打交道的技术从业者&#xff0c;我第一次使用InstructPix2Pix时的感受可以用"惊艳"来形容。传统的图像编辑工具需要…...

AMD平台黑苹果智能配置引擎:从技术困境到自动化解决方案的完整指南

AMD平台黑苹果智能配置引擎&#xff1a;从技术困境到自动化解决方案的完整指南 【免费下载链接】OpCore-Simplify A tool designed to simplify the creation of OpenCore EFI 项目地址: https://gitcode.com/GitHub_Trending/op/OpCore-Simplify 在传统黑苹果配置领域&…...

不会写代码?用TRAE+AI零代码搞定你的第一个Obsidian插件(2025最新版)

不会写代码&#xff1f;用TRAEAI零代码搞定你的第一个Obsidian插件&#xff08;2025最新版&#xff09; 你是否曾经在使用Obsidian时&#xff0c;发现现有的插件无法完全满足你的个性化需求&#xff1f;或许你想要一个能够自动整理笔记标签的工具&#xff0c;或者一个能根据内…...

EagleEye效果实测:在JetPack 6.0 + Orin AGX上实现15ms推理的边缘部署方案

EagleEye效果实测&#xff1a;在JetPack 6.0 Orin AGX上实现15ms推理的边缘部署方案 如果你正在为边缘设备寻找一个又快又准的目标检测方案&#xff0c;那么今天的内容可能会让你眼前一亮。我们刚刚在NVIDIA Jetson Orin AGX上&#xff0c;基于最新的JetPack 6.0系统&#xf…...

Qwen3-VL-8B开源AI聊天系统效果展示:多语言混合输入理解能力

Qwen3-VL-8B开源AI聊天系统效果展示&#xff1a;多语言混合输入理解能力 1. 系统概览与核心能力 Qwen3-VL-8B是一个基于通义千问大语言模型的Web聊天应用&#xff0c;提供了简洁美观的PC端聊天界面。这个完整的AI聊天系统包含前端界面、反向代理服务器和vLLM推理后端&#xf…...

别再只盯着model.score()了!Python机器学习模型评估的5种实用方法对比

超越model.score()&#xff1a;Python机器学习模型评估的五大实战工具 当你的机器学习模型在测试集上表现不佳时&#xff0c;model.score()给出的单一数值往往无法揭示问题的全貌。就像医生不能仅凭体温判断病情一样&#xff0c;数据科学家也需要更丰富的诊断工具来全面评估模型…...

Flux Sea Studio 入门:十分钟完成星图平台镜像部署并生成首张图片

Flux Sea Studio 入门&#xff1a;十分钟完成星图平台镜像部署并生成首张图片 想试试最近很火的AI绘画&#xff0c;但又觉得本地部署太麻烦&#xff0c;显卡要求太高&#xff1f;今天咱们就来聊聊一个超级省事的办法——直接在云端用Flux Sea Studio。你不需要懂代码&#xff…...