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源代码,以得到相关库。

  结果是大碰壁:

markup 复制代码
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的工具链无法编译汇编代码。

markup 复制代码
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库部分如下:

markup 复制代码
INCLUDEPATH += $$PWD/cryptlib

LIBS += -L$$PWD -lcryptlib

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

markup 复制代码
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)中体现如下:

markup 复制代码
INCLUDEPATH += $$PWD/cryptlib
INCLUDEPATH += $$PWD/fslib

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

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

(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构建)下载

相关推荐
闪闪发亮的小星星9 小时前
高斯光以及高斯光公式解释
笔记
桥田智能9 小时前
桥田智能 QT-650S:面向白车身焊装的 800kg 重载快换解决方案
开发语言·qt·系统架构
cqbzcsq10 小时前
CellFlow虚拟细胞论文阅读
论文阅读·人工智能·笔记·学习·生物信息
森G11 小时前
75、服务器源码解析---------云视频服务项目
linux·服务器·网络·c++·qt
阿米亚波11 小时前
【Windows】QEMU 启动 openEuler aarch64/arm64 架构系统 + 离线软件源
linux·windows·经验分享·笔记·架构·arm
自传.11 小时前
尚硅谷 Vibe Coding|第三章(1) Claude Code深度使用与进阶技巧 学习笔记
笔记·学习·尚硅谷·vibecoding
森G12 小时前
77、线程池原理和实现------服务器源码解析----云视频服务项目
服务器·c++·qt
.千余12 小时前
【C++】模板进阶全解:非类型参数|全特化|偏特化|分离编译完全指南
开发语言·c++·笔记·学习·其他
自传.12 小时前
尚硅谷 Vibe Coding|第二章 AI编程工具生态 学习笔记
笔记·学习·ai编程·尚硅谷·vibe coding
森G13 小时前
71、打包发布---------打包发布
c++·qt