二次开发的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

至此,编译链接通过。

相关推荐
一品人家1 小时前
win32汇编使用GDI+入门教程之九
汇编·windows·win32汇编
天才奇男子4 小时前
HAProxy高级功能全解析
linux·运维·服务器·微服务·云原生
学嵌入式的小杨同学4 小时前
【Linux 封神之路】信号编程全解析:从信号基础到 MP3 播放器实战(含核心 API 与避坑指南)
java·linux·c语言·开发语言·vscode·vim·ux
酥暮沐4 小时前
iscsi部署网络存储
linux·网络·存储·iscsi
darkb1rd5 小时前
四、PHP文件包含漏洞深度解析
网络·安全·php
❀͜͡傀儡师5 小时前
centos 7部署dns服务器
linux·服务器·centos·dns
哆啦code梦5 小时前
2024 OWASP十大安全威胁解析
安全·系统安全·owasp top 10
Dying.Light5 小时前
Linux部署问题
linux·运维·服务器
S19015 小时前
Linux的常用指令
linux·运维·服务器
小义_5 小时前
【RH134知识点问答题】第7章 管理基本存储
linux·运维·服务器