二次开发的openssl在windows平台的编译

二次开发的openssl在windows平台的编译

原生openssl源码在windows平台应该是兼容的,理论上应该正常编译通过无报错。

本次编译是未知人员在openssl1.1.1m版本基础上开发的支持tlcp协议的openssl,可能只支持linux平台,在windows平台编译遇到众多错误,主要为找不到dlopen系列函数。

使用visual studio2026编译出现出现问题,使用AI追问windows平台使用dlopen函数问题,无意中发现mingw64更合适,这些环境提供了 POSIX 兼容层,包括 unistd.h,于是改用msys2/mingw64编译。下面是下载安装配置工具的详细过程:

MSYS2/MinGW 编译环境搭建完整指南

1. 下载和安装 MSYS2

**下载地址:**

**安装步骤:**

```bash

1. 下载 msys2-x86_64-xxxxxxxx.exe

2. 以管理员身份运行安装程序

3. 安装到默认路径(推荐):C:\msys64

4. 安装完成后取消勾选"立即运行"

```

2. 初始化和更新系统

**首次启动:**

```bash

启动 MSYS2 MSYS 终端(不是 MinGW 终端)

更新包数据库和核心包

pacman -Syu

系统会要求重启终端,关闭后重新打开

再次更新剩余的包

pacman -Su

```

3. 安装开发工具链

**基础开发环境:**

```bash

安装基础开发工具

pacman -S base-devel

安装 MinGW-w64 工具链(64位)

pacman -S mingw-w64-x86_64-toolchain

安装 32位工具链(可选)

pacman -S mingw-w64-i686-toolchain

```

**验证安装:**

```bash

启动 MSYS2 MinGW 64-bit 终端

gcc --version

g++ --version

make --version

```

4. 安装常用开发库

**基础库:**

```bash

安装常用开发库

pacman -S mingw-w64-x86_64-cmake

pacman -S mingw-w64-x86_64-ninja

pacman -S mingw-w64-x86_64-pkg-config

pacman -S mingw-w64-x86_64-dlfcn

pacman -S mingw-w64-x86_64-openssl

```

**Git 和其他工具:**

```bash

pacman -S git

pacman -S vim

pacman -S wget

pacman -S unzip

```

5. 环境配置

**环境变量设置:**

```bash

在 Windows 系统环境变量中添加:

Path 变量添加:

C:\msys64\mingw64\bin

C:\msys64\usr\bin

创建 MSYS2_PATH_TYPE 环境变量(可选)

MSYS2_PATH_TYPE=inherit

```

**Shell 配置:**

```bash

编辑 ~/.bashrc

vim ~/.bashrc

添加常用别名

alias ll='ls -la'

alias la='ls -A'

alias l='ls -CF'

设置编译环境

export CC=gcc

export CXX=g++

export MAKEFLAGS="-j$(nproc)"

```

6. 三种终端的区别

| 终端类型 | 用途 | PATH 环境 | 编译目标 |

|----------|------|-----------|----------|

| **MSYS2 MSYS** | 系统管理、包安装 | `/usr/bin` | POSIX 应用 |

| **MSYS2 MinGW 64-bit** | 64位 Windows 应用开发 | `/mingw64/bin` | Windows x64 |

| **MSYS2 MinGW 32-bit** | 32位 Windows 应用开发 | `/mingw32/bin` | Windows x86 |

7. 测试环境

**编写测试程序:**

```c

// test.c

#include <stdio.h>

#include <unistd.h>

#include <dlfcn.h>

int main() {

printf("Hello MSYS2/MinGW!\n");

printf("Process ID: %d\n", getpid());

// 测试动态链接

void* handle = dlopen(NULL, RTLD_LAZY);

if (handle) {

printf("dlopen test passed!\n");

dlclose(handle);

}

return 0;

}

```

**编译测试:**

```bash

在 MinGW 64-bit 终端中

gcc -o test test.c -ldl

./test.exe

```

8. OpenSSL 编译示例

```bash

下载 OpenSSL 源码

wget https://www.openssl.org/source/openssl-3.1.4.tar.gz

tar -xzf openssl-3.1.4.tar.gz

cd openssl-3.1.4

配置编译(MinGW 64位)

./Configure mingw64 --prefix=/mingw64 --openssldir=/mingw64/ssl

编译安装

make -j$(nproc)

make install

```

9. 常用包管理命令

```bash

搜索包

pacman -Ss package_name

安装包

pacman -S package_name

删除包

pacman -R package_name

更新系统

pacman -Syu

查看已安装包

pacman -Q

查看包信息

pacman -Si package_name

```

10. 常见问题解决

**问题1:找不到头文件**

```bash

确保使用正确的终端(MinGW 而不是 MSYS)

检查包是否安装正确

pacman -Qs mingw-w64-x86_64-headers

```

**问题2:编译的程序无法在其他 Windows 机器运行**

```bash

静态链接

gcc -static -o program program.c

或复制必要的 DLL 文件

ldd program.exe # 查看依赖

```

**问题3:路径问题**

```bash

使用 MSYS2 路径转换

cygpath -w /mingw64/bin # 转为 Windows 路径

cygpath -u "C:\msys64\mingw64\bin" # 转为 Unix 路径

```

搭建完成后,你就有了一个功能完整的类 Unix 编译环境,支持编译 Windows 原生应用程序!

使用msys2安装工具包,然后使用mingw64编译openssl,编译参数为:

./config --prefix=/usr/local/openssl enable-sm2 enable-sm3 enable-sm4 enable-tlcp no-asm

遇到众多找不到的函数,基本是windows平台不支持的Linux函数,一一结合AI给出的代码在源码中添加了对应的windows实现。最后编译时未出现dlopen问题,链接时却提示找不到dlopen系列函数。

分析:编译没有问题,说明编译环境有头文件,系统应该有对应的库文件,编译有问题说明没有库文件,应该是编译参数给的不对导致没有找到-ldl库。

测试验证:使用dlopen写测试函数,并编译:

gcc dlopen-test.c -o dlopen // 未定义dlopen函数

gcc -ldl dlopen-test.c -o dlopen //未定义dlopen函数

gcc dlopen-test.c -o dlopen -ldl //编译成功

windows平台可能对动态库的加载顺序有要求,查看openssl的makefile文件,找到了可以通过变量EX_LIBS在编译命令最后追究指定库:

EX_LIBS = -ldl

至此,编译链接通过。

相关推荐
KingRumn1 天前
Linux信号之标准信号与实时信号
linux·算法
QT 小鲜肉1 天前
【Linux命令大全】001.文件管理之git命令(实操篇)
linux·服务器·笔记·git·elasticsearch
sishen41991 天前
嵌入式Linux没有学习方向怎么办,嵌入式Linux怎么学
linux
逆风水手1 天前
Ansible自动化运维入门指南
linux·运维·自动化·ansible
小波小波轩然大波1 天前
openstack总结
windows·php·openstack
旖旎夜光1 天前
Linux(3)(下)
linux·学习
小鹿学程序1 天前
任务一-1.子任务一:基础环境准备
linux·bigdata
Nautiluss1 天前
一起玩XVF3800麦克风阵列(十)
linux·人工智能·python·音频·语音识别·实时音视频·dsp开发
悲喜自渡7211 天前
Python 编程(gem5 )
java·linux·开发语言