尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

Windows 10下使用VS2019编译OpenSSL 1.1.1w动态与静态库全攻略

Windows 10下使用VS2019编译OpenSSL 1.1.1w动态与静态库全攻略 简介本资源是专为Windows平台C开发者提供的OpenSSL 1.1.1w完整编译成果包面向使用Visual Studio 2019进行安全通信开发的中高级工程师解决在win10 x64环境下难以快速获取兼容MSVC2019的动态/静态OpenSSL库这一常见痛点。压缩包为7z格式共348个文件含318个头文件.h用于接口调用、10个.lib库文件供链接、4个.dll动态库及配套3个.pdb调试符号总大小24.96MB结构清晰分为install_shared含libssl-1_1-x64.dll等运行时动态库、install_static_mt多线程静态库无运行时依赖和install_static_md带调试信息的静态库三大目录覆盖发布与调试全场景。目前已有335人学习下载开箱即用省去从源码配置nmake、处理perl依赖、规避msvc版本兼容性报错等繁琐过程可直接集成至VS2019项目显著提升HTTPS、加解密模块开发效率。1. 项目缘起与核心价值最近在折腾一个需要用到HTTPS加密通信的C项目环境是Windows 10搭配Visual Studio 2019目标平台是x64。项目依赖的第三方库点名要OpenSSL 1.1.1w版本这让我不得不面对一个老生常谈但又避不开的问题自己动手编译OpenSSL。你可能也遇到过直接从官网下载的预编译二进制包要么版本不对要么链接方式动态库/静态库不匹配要么就是编译选项和你的项目需求有出入导致链接时一堆“LNK2001: 无法解析的外部符号”错误非常头疼。自己编译OpenSSL听起来有点“硬核”但实际上这是获得最符合你项目需求的库文件最直接、最可靠的方法。特别是对于生产环境或需要深度定制的场景掌握从源码到二进制产出的全过程意味着你对依赖链有完全的控制权。这次的目标很明确在Win10系统上使用MSVC 2019的x64原生工具链分别编译出OpenSSL 1.1.1w的动态链接库DLL和静态链接库LIB。这不仅仅是完成一个编译任务更是理解Windows下C/C项目依赖管理、构建工具链配置的一次绝佳实践。无论你是为了集成到自己的项目中还是单纯想学习大型C项目在Windows上的构建过程这篇记录都能给你一份可复现的“操作手册”。2. 编译环境准备与工具链解析工欲善其事必先利其器。在Windows上编译一个像OpenSSL这样庞大且依赖特定工具链的C项目环境准备是第一步也是最容易踩坑的一步。2.1 系统与编译器环境确认首先确保你的操作系统是Windows 10或Windows 11其底层与Win10在开发层面兼容性很高。编译过程对系统版本没有极端要求但需要保证有足够的磁盘空间建议预留至少5GB和稳定的网络用于下载源码和可能的依赖。核心是编译器。我们使用的是Microsoft Visual C 2019即MSVC 2019。你需要安装Visual Studio 2019并在安装时勾选“使用C的桌面开发”工作负载。这将会安装MSVC编译器cl.exe、链接器link.exe以及至关重要的“x64 Native Tools Command Prompt for VS 2019”x64本机工具命令提示符。绝对不要在普通的CMD或PowerShell中直接开始编译必须使用这个专门配置了环境变量的命令提示符。它内部自动设置了INCLUDE、LIB、PATH等环境变量指向正确的x64版编译器和库路径这是成功编译的基石。你可以通过打开“开始”菜单搜索“x64 Native Tools Command Prompt for VS 2019”来启动它。启动后输入cl命令如果能看到Microsoft C/C编译器的版本信息说明环境基本就绪。2.2 源码获取与辅助工具安装接下来是获取源码。前往OpenSSL官网的下载页面找到1.1.1系列下载openssl-1.1.1w.tar.gz。虽然OpenSSL 1.1.1系列已结束支持但许多现有项目仍依赖此版本1.1.1w是其最终更新版本相对稳定。将下载的压缩包解压到一个没有中文和空格的路径下例如D:\Dev\openssl-1.1.1w。路径简洁可以避免后续脚本处理时出现意外错误。编译OpenSSL还需要两个辅助工具Perl和NASM。PerlOpenSSL的配置脚本Configure是用Perl写的。你需要安装一个Windows版本的Perl例如Strawberry Perl或ActiveState Perl。安装后确保Perl的可执行文件路径如C:\Strawberry\perl\bin被添加到系统的PATH环境变量中。在刚才打开的x64 Native命令提示符中输入perl -v能显示版本信息即表示配置成功。NASMNetwide AssemblerOpenSSL的部分加密算法优化代码是用汇编写的在x64 Windows平台上编译需要使用NASM来汇编这些代码。从NASM官网下载最新稳定版的Windows安装程序并安装。同样需要将其安装目录如C:\NASM添加到系统的PATH变量中。在命令提示符中输入nasm -v进行验证。注意环境变量修改后必须重新打开“x64 Native Tools Command Prompt for VS 2019”新的PATH设置才会在其中生效。这是很多新手忽略的关键一步导致始终找不到perl或nasm命令。2.3 编译目标规划动态库 vs 静态库在开始编译前我们要理清目标。OpenSSL可以编译为两种库动态库Dynamic Link Library, DLL 编译后会产生.dll运行时加载和.lib导入库用于链接文件。你的应用程序在运行时需要这些DLL文件存在于系统路径或程序目录。优点是多个程序可以共享同一份DLL节省磁盘和内存便于更新替换DLL即可。静态库Static Library, LIB 编译后产生.lib文件静态库本身所有代码在链接阶段就被打包进你的最终可执行文件EXE。生成的可执行文件体积更大但部署简单无需携带额外的DLL文件避免了“DLL地狱”问题。我们将分别编译这两种类型。通常建议将OpenSSL编译为动态库除非你有明确的静态链接需求比如发布一个独立的、不希望依赖外部DLL的工具。我们将分别在不同的构建目录中进行以避免相互干扰。3. 编译流程详细拆解与实操一切准备就绪现在进入核心的编译环节。我们将采用“源码外构建”的方式即在源码目录外创建专门的构建目录保持源码目录的纯净。3.1 配置阶段生成定制化的构建文件首先打开“x64 Native Tools Command Prompt for VS 2019”并切换到你计划进行构建的父目录例如D:\Build。步骤一为动态库DLL创建构建目录并配置mkdir openssl-1.1.1w_dynamic_x64 cd openssl-1.1.1w_dynamic_x64 perl D:\Dev\openssl-1.1.1w\Configure VC-WIN64A --prefixD:\Libs\openssl-1.1.1w_dynamic_x64 no-asm让我们拆解这条命令perl ...\Configure调用Perl执行源码目录下的配置脚本。VC-WIN64A这是目标平台标识符。VC表示使用Visual C编译器WIN64A表示目标是64位Windows且使用x64AMD64架构和API。--prefixD:\Libs\openssl-1.1.1w_dynamic_x64指定安装目录。编译安装后所有的头文件、库文件都会按照标准布局复制到这个目录下方便项目管理。你可以根据喜好修改此路径。no-asm这是一个关键选项。它告诉配置脚本不使用汇编代码。为什么因为OpenSSL默认会使用一些高度优化的汇编代码通过NASM编译但这些汇编代码有时会与最新版本的MSVC或Windows SDK产生兼容性问题导致链接错误。对于大多数应用场景使用纯C实现的算法性能已经足够且兼容性最好。如果你是极致性能追求者且能解决潜在的链接问题可以移除no-asm选项并确保NASM已正确配置。执行后配置脚本会输出一系列检查结果并在当前目录生成一个名为makefile的定制化构建文件。步骤二为静态库LIB创建构建目录并配置打开一个新的“x64 Native Tools Command Prompt for VS 2019”窗口或者退回上级目录。cd D:\Build mkdir openssl-1.1.1w_static_x64 cd openssl-1.1.1w_static_x64 perl D:\Dev\openssl-1.1.1w\Configure VC-WIN64A no-shared --prefixD:\Libs\openssl-1.1.1w_static_x64 no-asm注意这里的区别增加了no-shared选项。这个选项就是告诉构建系统“我们只编译静态库不要生成DLL”。其他参数含义同动态库配置。3.2 编译与链接阶段执行构建命令配置完成后两个目录下都有了对应的makefile。编译和安装命令是通用的但需要在各自的构建目录下执行。在动态库构建目录openssl-1.1.1w_dynamic_x64中执行nmake nmake test nmake install在静态库构建目录openssl-1.1.1w_static_x64中执行同样的命令nmake nmake test nmake install命令解析nmake这是Microsoft的make工具它会读取当前目录的makefile调用cl.exe和link.exe进行编译和链接。这个过程耗时较长取决于你的CPU性能可能需要5-15分钟。控制台会滚动输出大量的编译信息。nmake test强烈建议执行。这会运行OpenSSL自带的测试套件验证编译出来的库在功能上是否正确。如果所有测试通过会显示“All tests successful.”。如果出现测试失败通常意味着编译环境或配置有问题需要回头检查。nmake install将编译好的库文件、头文件等按照之前--prefix指定的目录结构进行复制和安装。执行成功后你指定的D:\Libs\openssl-1.1.1w_xxx_x64目录下会出现include、lib、bin等文件夹。3.3 产出物分析与验证编译安装完成后我们来查看一下成果。动态库产出目录(D:\Libs\openssl-1.1.1w_dynamic_x64)bin\包含运行时所需的DLL文件例如libcrypto-1_1-x64.dll和libssl-1_1-x64.dll。发布程序时需要将这些DLL与你的EXE放在一起。lib\包含链接时所需的导入库文件例如libcrypto.lib和libssl.lib。注意这些是导入库体积很小仅包含DLL的函数定位信息。在VS项目中你需要链接这些.lib文件。include\包含所有的C语言头文件.h在你的代码中#include openssl/ssl.h时编译器就是从这里查找。静态库产出目录(D:\Libs\openssl-1.1.1w_static_x64)lib\这里包含的是真正的静态库文件例如libcrypto.lib和libssl.lib。这些文件体积巨大可能几十MB因为它们包含了所有函数和数据的实际代码。bin目录下是空的因为没有生成DLL。include\头文件与动态库版本一致。快速验证你可以写一个简单的C程序来测试库是否可用。// test_openssl.c #include stdio.h #include openssl/ssl.h int main() { printf(OpenSSL version: %s\n, OpenSSL_version(SSLEAY_VERSION)); return 0; }使用命令行编译以动态库为例注意替换你的实际路径cl /I D:\Libs\openssl-1.1.1w_dynamic_x64\include test_openssl.c /link /LIBPATH:D:\Libs\openssl-1.1.1w_dynamic_x64\lib libssl.lib libcrypto.lib如果编译链接成功并运行打印出OpenSSL版本号如“OpenSSL 1.1.1w 11 Sep 2023”则说明库配置完全正确。4. 集成到Visual Studio项目的最佳实践将自编译的OpenSSL集成到你的VS2019项目中比使用预编译包更灵活但也需要正确配置。4.1 项目属性配置以动态库为例包含目录Include Directories 在项目属性 - C/C - 常规 - 附加包含目录中添加你的OpenSSL的include目录路径例如D:\Libs\openssl-1.1.1w_dynamic_x64\include。库目录Library Directories 在项目属性 - 链接器 - 常规 - 附加库目录中添加你的OpenSSL的lib目录路径例如D:\Libs\openssl-1.1.1w_dynamic_x64\lib。附加依赖项Additional Dependencies 在项目属性 - 链接器 - 输入 - 附加依赖项中添加libssl.lib;libcrypto.lib;。注意分号分隔。运行时库Runtime Library 确保你的项目属性 - C/C - 代码生成 - 运行时库与OpenSSL编译时使用的运行时库一致。通常使用/MD或/MDd多线程DLL用于动态链接CRT。OpenSSL默认编译选项通常是/MDRelease和/MDdDebug。不一致会导致链接错误。如果你编译OpenSSL时未特殊指定它默认使用/MD。如果你的Debug项目使用/MDd可能需要重新编译一个Debug版的OpenSSL或者将项目改为使用/MD不推荐Debug改Runtime Library。4.2 静态库集成的特殊注意事项如果你选择集成静态库除了上述包含目录和库目录的配置指向静态库版本目录外还有两个极其重要的额外步骤预处理器定义Preprocessor Definitions 在项目属性 - C/C - 预处理器 - 预处理器定义中必须添加OPENSSL_NO_DEPRECATED。这是因为OpenSSL 1.1.1版本中很多旧的API被标记为“deprecated”已弃用。当静态链接时这些废弃的符号会全部被包含进你的可执行文件。如果不定义此宏在链接时可能会与Windows SDK或其他库特别是较新版本的VC运行时库中定义的同名符号发生冲突导致“LNK2005: 符号已在...中定义”的错误。定义此宏可以避免编译废弃的API代码。链接器输入 附加依赖项同样是libssl.lib;libcrypto.lib;但链接的是静态库目录下的文件。运行时库一致性 静态链接OpenSSL时对运行时库的一致性要求更为严格。务必确保你的项目与OpenSSL静态库使用相同的运行时库选项/MT、/MTd、/MD、/MDd。最稳妥的方式是在编译OpenSSL时通过no-shared的同时在Configure命令后加上no-threads如果不需要线程安全或通过环境变量CFLAGS指定/MT但这比较复杂。对于大多数情况使用动态库是更简单兼容性更好的选择。4.3 部署考量DLL的放置对于动态库版本编译成功的程序在运行时需要找到对应的DLL。有几种部署方式与EXE同目录将libcrypto-1_1-x64.dll和libssl-1_1-x64.dll复制到你的应用程序exe文件所在的目录。这是最推荐的方式便于管理且不会污染系统。添加到系统PATH将包含DLL的目录如D:\Libs\openssl-1.1.1w_dynamic_x64\bin添加到系统的PATH环境变量。但这种方式影响全局不推荐特别是多版本共存时容易混乱。修改项目输出目录在VS项目属性 - 生成事件 - 生成后事件中添加命令行将DLL复制到输出目录$(OutDir)实现自动拷贝。5. 疑难杂症排查与经验实录即便按照步骤操作也可能会遇到各种问题。下面是我在多次编译中踩过的坑和解决方案。5.1 常见编译错误与解决方案错误现象可能原因解决方案‘perl’ 不是内部或外部命令Perl未安装或未正确添加到系统PATH或未在新打开的VS命令提示符中生效。1. 确认Perl已安装。2. 检查系统环境变量PATH。3.关闭所有命令提示符窗口重新打开“x64 Native Tools Command Prompt”。‘nasm’ 不是内部或外部命令NASM未安装或PATH配置错误。同上检查NASM安装和PATH并重启VS命令提示符。配置时提示“系统找不到指定的路径”源码路径或Perl路径中包含中文或空格。将OpenSSL源码解压到纯英文、无空格的目录如D:\Dev\。nmake编译过程中出现大量C1083: 无法打开包括文件: ‘xxx.h’通常是因为Windows SDK或平台工具集未安装或损坏。运行Visual Studio Installer为VS2019修改安装项确保安装了对应版本的“Windows 10 SDK”和“MSVC v142 - VS 2019 C x64/x86 生成工具”。链接错误 LNK2001: 无法解析的外部符号 __iob_func 等这是使用no-asm选项时最常见的兼容性问题。OpenSSL某些代码引用了旧版VC运行时的内部符号。在配置命令中额外添加-DOPENSSL_USE_APPLINK。完整配置示例perl Configure VC-WIN64A no-asm -DOPENSSL_USE_APPLINK ...。这个宏会启用一个应用链接层来解决符号兼容问题。nmake test测试失败编译环境不纯净、源码损坏、或系统环境干扰如杀毒软件。1. 尝试在全新的构建目录重新配置编译。2. 关闭实时防病毒软件有时它会干扰测试程序的执行。3. 确保之前没有其他版本的OpenSSL DLL在系统目录干扰。集成到项目后Debug编译链接失败Release正常Debug和Release的运行时库不匹配。OpenSSL默认编译为Release (/MD)而你的Debug项目使用/MDd。方案一推荐为你的Debug项目也使用/MD运行时库但会失去一些Debug特性。方案二编译一个Debug版本的OpenSSL库。这需要更复杂的配置通常通过设置环境变量CFLAGS/MDd再配置编译但容易引入新问题。5.2 高级技巧与优化建议并行编译加速nmake支持多线程编译以利用多核CPU。在编译命令后添加-j N参数其中N是你的CPU核心数例如8核CPU用-j 8。命令变为nmake -j 8。这可以显著缩短编译时间。清理构建如果你想在同一个目录重新配置编译先执行nmake clean来清理之前的中间文件和产出物然后再执行新的perl Configure...和nmake。自定义编译选项通过Configure命令可以启用或禁用特定功能。例如no-zlib不编译zlib压缩支持。no-unit-test不编译单元测试代码可以稍微加快编译速度。enable-weak-ssl-ciphers启用一些被认为较弱的加密套件通常不建议。 你可以通过执行perl Configure --help查看所有可用选项。版本管理与备份将成功编译并安装好的include和lib目录整体打包备份。以后在新环境或新电脑上配置项目时直接解压这些目录并配置VS项目路径即可无需重新编译非常方便。关于OpenSSL 3.0OpenSSL 3.0是一个主要版本更新API和许可证有变化。如果你的新项目没有历史包袱可以考虑从1.1.1升级到3.x。编译过程大同小异但需要注意OpenSSL 3.0默认启用FIPS模块并且一些API已被废弃。对于依赖1.1.1的现有项目坚持使用1.1.1w是更稳妥的选择。整个编译过程从环境准备到最终集成其核心在于对工具链和构建流程的精确控制。自己编译虽然前期需要一些投入但换来的是对依赖的绝对掌控和更深层次的理解。当你的项目能够顺利链接并运行起来时这种成就感是直接使用预编译包无法比拟的。希望这份详尽的记录能帮你扫清障碍成功构建出属于你自己的OpenSSL库。如果在实际操作中遇到表格未覆盖的新问题不妨回顾一下环境变量、路径、以及运行时库匹配这几个基本点大多数问题都源于此。本文还有配套的精品资源点击获取
返回列表