二次开发的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
至此,编译链接通过。