OpenSSL 3.0.18 完整编译记录(基于Windows)

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 MBOpenSSL命令行工具

生成位置

  • 库文件在当前目录根目录
  • 可执行文件在 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 MBSSL/TLS库动态链接库

导入库文件 (LIB)

文件名大小描述
libcrypto.lib约1-2 MBlibcrypto的导入库
libssl.lib约100-200 KBlibssl的导入库

备用静态库

文件名大小描述
libcrypto_static.lib约35-40 MB静态加密库
libssl_static.lib约5-6 MB静态SSL/TLS库

可执行文件

文件名大小描述
apps\openssl.exe约4-5 MBOpenSSL命令行工具

4. 特点

优点

  • ✅ 程序体积小
  • ✅ 多个程序可以共享同一个DLL
  • ✅ 更新库无需重新编译程序
  • ✅ 节省内存空间

缺点

  • ❌ 需要分发DLL文件
  • ❌ 运行时依赖,需要DLL在路径中
  • ❌ 可能需要Visual C++运行时

5. 使用方式

编译时

// 链接导入库
#pragma comment(lib, "libcrypto.lib")
#pragma comment(lib, "libssl.lib")

运行时

  • 确保 libcrypto-3-x64.dlllibssl-3-x64.dll 在:
    • 系统PATH中,或
    • 应用程序同一目录下,或
    • Windows系统目录

6. DLL文件命名规则

OpenSSL 3.x 的动态库命名格式:

  • libcrypto-<version>-<arch>.dll
  • libssl-<version>-<arch>.dll

示例:libcrypto-3-x64.dll


通用编译问题解决

问题1:架构冲突

错误信息

fatal error LNK1112: 模块计算机类型"x86"与目标计算机类型"x64"冲突

解决方案

  1. 清理所有编译文件:
    nmake clean
    
  2. 删除所有 .obj 文件:
    Get-ChildItem -Recurse -Include *.obj | Remove-Item -Force
    
  3. 确保使用64位环境:
    call "C:\Program Files\Microsoft Visual Studio\2022\Professional\Common7\Tools\VsDevCmd.bat" -arch=x64
    
  4. 重新配置和编译

问题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+导入库

关键差异

  • 配置时使用 sharedno-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 导入

项目使用指南

使用静态库

  1. 在项目属性中添加库目录
  2. 在链接器设置中指定:
    • libcrypto.lib
    • libssl.lib
  3. 无需处理DLL文件
  4. 程序完全自包含

使用动态库

  1. 在项目属性中添加库目录
  2. 在链接器设置中指定:
    • libcrypto.lib
    • libssl.lib
  3. 将DLL文件复制到:
    • 程序输出目录,或
    • 系统PATH目录
  4. 确保运行时能找到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,输入小通密码即可下载

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值