OpenSSL 3.0.18 完整编译记录
概述
本文档记录了在Windows环境下使用Visual Studio 2022 Professional编译OpenSSL 3.0.18的完整过程,包括静态库版本和动态库版本。
环境信息
- 操作系统: Windows 10 (10.0.19045)
- 编译器: Visual Studio 2022 Professional
- Perl版本: v5.10.0 (MSWin32-x86-multi-thread)
- 目标架构: x64 (64位)
- OpenSSL版本: 3.0.18 (30 Sep 2025)
- 编译日期: 2025年10月29日
重要说明
路径配置要求
OpenSSL的 --prefix 和 --openssldir 参数必须使用绝对路径,不能使用相对路径。
正确方式:
perl Configure VC-WIN64A --prefix=%CD%\build --openssldir=%CD%\build\ssl no-shared no-tests
错误方式:
perl Configure VC-WIN64A --prefix=./build --openssldir=./build/ssl no-shared no-tests
# 错误信息: Directory given with --prefix MUST be absolute
替代方案:
- 使用
%CD%环境变量(推荐) - 使用完整绝对路径
- 使用
pwd命令获取当前路径
第一部分:静态库编译 (Static Library)
1. 编译配置
配置命令:
perl Configure VC-WIN64A --prefix=%CD%\build --openssldir=%CD%\build\ssl no-shared no-tests
关键参数说明:
VC-WIN64A: Visual Studio 64位配置--prefix: 安装目录前缀(必须使用绝对路径)--openssldir: OpenSSL配置文件目录(必须使用绝对路径)no-shared: 生成静态库(不生成动态库)no-tests: 跳过测试程序编译(可选,加快编译速度)
注意: %CD% 是Windows环境变量,表示当前目录的绝对路径
2. 编译命令
完整编译脚本:
# 设置Visual Studio环境
call "C:\Program Files\Microsoft Visual Studio\2022\Professional\Common7\Tools\VsDevCmd.bat" -arch=x64
# 清理之前的编译
nmake clean
# 配置
perl Configure VC-WIN64A --prefix=%CD%\build --openssldir=%CD%\build\ssl no-shared no-tests
# 编译
nmake
# 安装(可选)
nmake install
3. 编译结果
静态库文件:
| 文件名 | 大小 | 描述 |
|---|---|---|
libcrypto.lib | 约35-40 MB | 静态加密库 |
libssl.lib | 约5-6 MB | 静态SSL/TLS库 |
可执行文件:
| 文件名 | 大小 | 描述 |
|---|---|---|
apps\openssl.exe | 约4-5 MB | OpenSSL命令行工具 |
生成位置:
- 库文件在当前目录根目录
- 可执行文件在
apps\目录
4. 特点
优点:
- ✅ 无需运行时依赖,便于分发
- ✅ 所有代码链接到可执行文件中
- ✅ 性能可能略优于动态库
缺点:
- ❌ 生成的程序体积大
- ❌ 无法共享内存中的库代码
- ❌ 更新库需要重新编译程序
5. 使用方式
// 在项目中链接静态库
#pragma comment(lib, "libcrypto.lib")
#pragma comment(lib, "libssl.lib")
// 或者直接在链接器设置中指定
第二部分:动态库编译 (Dynamic Library)
1. 编译配置
配置命令:
perl Configure VC-WIN64A --prefix=%CD%\build --openssldir=%CD%\build\ssl shared no-tests
关键参数说明:
VC-WIN64A: Visual Studio 64位配置--prefix: 安装目录前缀(必须使用绝对路径)--openssldir: OpenSSL配置文件目录(必须使用绝对路径)shared: 生成动态库no-tests: 跳过测试程序编译(可选)
注意: %CD% 是Windows环境变量,表示当前目录的绝对路径
2. 编译命令
完整编译脚本:
# 设置Visual Studio环境
call "C:\Program Files\Microsoft Visual Studio\2022\Professional\Common7\Tools\VsDevCmd.bat" -arch=x64
# 清理之前的编译
nmake clean
# 配置
perl Configure VC-WIN64A --prefix=%CD%\build --openssldir=%CD%\build\ssl shared no-tests
# 编译
nmake
# 安装(可选)
nmake install
3. 编译结果
动态库文件 (DLL):
| 文件名 | 大小 | 描述 |
|---|---|---|
libcrypto-3-x64.dll | 约5-6 MB | 加密库动态链接库 |
libssl-3-x64.dll | 约800 KB - 1 MB | SSL/TLS库动态链接库 |
导入库文件 (LIB):
| 文件名 | 大小 | 描述 |
|---|---|---|
libcrypto.lib | 约1-2 MB | libcrypto的导入库 |
libssl.lib | 约100-200 KB | libssl的导入库 |
备用静态库:
| 文件名 | 大小 | 描述 |
|---|---|---|
libcrypto_static.lib | 约35-40 MB | 静态加密库 |
libssl_static.lib | 约5-6 MB | 静态SSL/TLS库 |
可执行文件:
| 文件名 | 大小 | 描述 |
|---|---|---|
apps\openssl.exe | 约4-5 MB | OpenSSL命令行工具 |
4. 特点
优点:
- ✅ 程序体积小
- ✅ 多个程序可以共享同一个DLL
- ✅ 更新库无需重新编译程序
- ✅ 节省内存空间
缺点:
- ❌ 需要分发DLL文件
- ❌ 运行时依赖,需要DLL在路径中
- ❌ 可能需要Visual C++运行时
5. 使用方式
编译时:
// 链接导入库
#pragma comment(lib, "libcrypto.lib")
#pragma comment(lib, "libssl.lib")
运行时:
- 确保
libcrypto-3-x64.dll和libssl-3-x64.dll在:- 系统PATH中,或
- 应用程序同一目录下,或
- Windows系统目录
6. DLL文件命名规则
OpenSSL 3.x 的动态库命名格式:
libcrypto-<version>-<arch>.dlllibssl-<version>-<arch>.dll
示例:libcrypto-3-x64.dll
通用编译问题解决
问题1:架构冲突
错误信息:
fatal error LNK1112: 模块计算机类型"x86"与目标计算机类型"x64"冲突
解决方案:
- 清理所有编译文件:
nmake clean - 删除所有
.obj文件:Get-ChildItem -Recurse -Include *.obj | Remove-Item -Force - 确保使用64位环境:
call "C:\Program Files\Microsoft Visual Studio\2022\Professional\Common7\Tools\VsDevCmd.bat" -arch=x64 - 重新配置和编译
问题2:环境变量未设置
错误信息:
'cl' 不是内部或外部命令
解决方案:
- 确保在批处理文件中调用 VsDevCmd.bat
- 或在Visual Studio Developer Command Prompt中执行
- 或手动设置PATH环境变量
问题3:PDB文件冲突
错误信息:
error: PDB file could not be written
解决方案:
- 使用单线程编译(较慢)
- 或继续执行,通常可以完成
- 关闭其他可能使用PDB的程序
问题4:Perl相关问题
确保:
- Perl已正确安装
- 使用命令
perl -v验证 - 如使用Strawberry Perl或ActivePerl都可以
批量编译脚本
静态库编译脚本 (build_static.bat)
@echo off
echo ========================================
echo OpenSSL 3.0.18 Static Library Build
echo ========================================
call "C:\Program Files\Microsoft Visual Studio\2022\Professional\Common7\Tools\VsDevCmd.bat" -arch=x64
echo Cleaning previous build...
nmake clean
echo Configuring for static library...
perl Configure VC-WIN64A --prefix=%CD%\build --openssldir=%CD%\build\ssl no-shared no-tests
echo Building...
nmake
echo ========================================
echo Build completed!
echo ========================================
pause
动态库编译脚本 (build_shared.bat)
@echo off
echo ========================================
echo OpenSSL 3.0.18 Dynamic Library Build
echo ========================================
call "C:\Program Files\Microsoft Visual Studio\2022\Professional\Common7\Tools\VsDevCmd.bat" -arch=x64
echo Cleaning previous build...
nmake clean
echo Configuring for dynamic library...
perl Configure VC-WIN64A --prefix=%CD%\build --openssldir=%CD%\build\ssl shared no-tests
echo Building...
nmake
echo ========================================
echo Build completed!
echo ========================================
pause
编译流程对比
静态库编译流程
设置环境 → 清理 → 配置(no-shared) → 编译 → 生成静态库
动态库编译流程
设置环境 → 清理 → 配置(shared) → 编译 → 生成DLL+导入库
关键差异:
- 配置时使用
shared或no-shared参数 - 静态库编译更快(无DLL生成过程)
- 动态库编译生成更多文件
验证结果
检查文件架构
dumpbin /headers libcrypto.lib | findstr "machine"
# 静态库: 无输出或显示目标架构
# 导入库: 显示目标架构
dumpbin /headers libcrypto-3-x64.dll | findstr "machine"
# 输出: 8664 machine (x64)
检查OpenSSL版本
apps\openssl.exe version
# 输出: OpenSSL 3.0.18 30 Sep 2025 (Library: OpenSSL 3.0.18 30 Sep 2025)
检查库类型
dumpbin /imports460 libcrypto.lib
# 静态库: 无DLL导入
# 导入库: 显示从 libcrypto-3-x64.dll 导入
项目使用指南
使用静态库
- 在项目属性中添加库目录
- 在链接器设置中指定:
libcrypto.liblibssl.lib
- 无需处理DLL文件
- 程序完全自包含
使用动态库
- 在项目属性中添加库目录
- 在链接器设置中指定:
libcrypto.liblibssl.lib
- 将DLL文件复制到:
- 程序输出目录,或
- 系统PATH目录
- 确保运行时能找到DLL
目录结构
openssl-3.0.18\ # OpenSSL源码目录
├── apps\
│ └── openssl.exe # 命令行工具
├── build_static.bat # 静态库编译脚本
├── build_shared.bat # 动态库编译脚本
├── libcrypto.lib # 静态/导入库
├── libssl.lib # 静态/导入库
├── libcrypto-3-x64.dll # 动态库(DLL)
├── libssl-3-x64.dll # 动态库(DLL)
├── libcrypto_static.lib # 备用静态库(动态编译时生成)
├── libssl_static.lib # 备用静态库(动态编译时生成)
└── build\ # 安装目录(编译后生成)
性能对比
| 特性 | 静态库 | 动态库 |
|---|---|---|
| 程序启动速度 | 更快 | 稍慢 |
| 内存占用 | 较高 | 较低 |
| 文件大小 | 较大 | 较小 |
| 更新便利性 | 需重新编译 | 替换DLL即可 |
| 部署复杂度 | 简单 | 需分发DLL |
| 运行依赖 | 无 | 需要DLL |
总结
选择建议
使用静态库的场景:
- 需要完全独立的程序
- 不方便分发DLL的嵌入式环境
- 对程序体积不敏感
使用动态库的场景:
- 需要多个程序共享库
- 需要频繁更新库版本
- 对程序体积有要求
- 标准桌面应用开发
本次编译成果
- ✅ 成功编译静态库版本
- ✅ 成功编译动态库版本
- ✅ 生成完整的库文件和工具
- ✅ 解决架构冲突问题
- ✅ 完整的编译文档记录
作者信息
网站: www.itgather.com
邮箱: itgather@163.com
公众号: 全栈代码工坊
本文首发于 IT Gather 技术社区,欢迎关注我们的公众号获取更多技术分享。
附件下载
网页分享: OpenSSL3d0d18完整编译附件.rar
小通密码: ctfile://xtc17802766-f8461652846-4739d9-1150
下载方法: 打开城通网盘客户端或APP,输入小通密码即可下载
3357

被折叠的 条评论
为什么被折叠?



