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

至此,编译链接通过。

相关推荐
视觉装置在笑7131 小时前
grep 命令基础用法
linux·运维
HalvmånEver1 小时前
Linux:进程等待(进程控制三)
linux·运维·服务器
干啥都是小小白1 小时前
Linux 驱动
linux·运维·服务器
向山行_wolf1 小时前
ubuntu20.04安装向日葵
linux·运维·服务器
eguid_11 小时前
【软件分享】简单的Windows无线电视投屏软件simpleTVCast,支持桌面镜像投屏和视频投屏
windows·电视投屏·音视频投屏·镜像投屏·桌面镜像投屏
飘忽不定的bug1 小时前
记录:ubuntu20.04隐藏鼠标指针
linux·ubuntu
松涛和鸣1 小时前
23、链式栈(LinkStack)的实现与多场景应用
linux·c语言·c++·嵌入式硬件·ubuntu
虾..1 小时前
Linux 进程替换
linux·运维·服务器
赖small强1 小时前
【Linux驱动开发】Linux Debugfs 虚拟文件系统深度解析与实战指南
linux·驱动开发·debugfs