二次开发的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 天前
AI 时代组网新范式:零信任软件定义组网,让连接更安全更灵活
网络·安全
实心儿儿1 天前
Linux —— 进程控制 - mini shell
linux·运维·服务器
程序员黄老师1 天前
Windows文件移动到Linux上的坑
linux·运维·服务器
mounter6251 天前
【内核前沿】Linux IPC 迎来大变局?POSIX 消息队列增强、io_uring IPC 与 Bus1 十年回归
linux·运维·服务器·kernel·ipc·io_uring
不怕犯错,就怕不做1 天前
Linux-Sensor驱动移植与调试(转载)
linux·驱动开发·嵌入式硬件
island13141 天前
最详细VMware Workstation 17 上安装 Ubuntu 系统
linux·数据库·ubuntu
2401_895521341 天前
Linux下安装Redis
linux·运维·redis
handler011 天前
拒绝权限报错!三分钟掌握 Linux 权限管理
linux·c语言·c++·笔记·学习
сокол1 天前
【网安-应急响应-基础记录】Windows入侵排查
windows·web安全·网络安全·系统安全
Bruce_Liuxiaowei1 天前
Windows防火墙规则导出工具:让安全配置可备份、可迁移、可审计
运维·windows·安全·网络安全