Debian环境下用MinGW编译含OpenSSL的Windows DLL的问题
当然可以在Debian的MinGW构建环境里搞定这个问题,你遇到的核心问题是混用了Linux原生的OpenSSL库和头文件——MinGW交叉编译需要的是针对Windows平台编译的OpenSSL版本。下面给你两种可行的解决方案,从简单到进阶:
方案一:直接用Debian仓库提供的MinGW版OpenSSL(推荐)
Debian的软件源里已经打包好了针对MinGW交叉编译的OpenSSL库,不用自己折腾源码编译,步骤如下:
安装对应架构的MinGW OpenSSL开发包
如果你是编译64位Windows DLL,执行:sudo apt install x86_64-w64-mingw32-libssl-dev如果是32位的,换成
i686-w64-mingw32-libssl-dev修改你的编译命令
安装完成后,MinGW编译器会自动找到对应的头文件和库文件,不需要手动加-I或-L参数,直接用你原来的命令即可:x86_64-w64-mingw32-gcc -shared -s FILE.c FILE.def -lcrypto -lws2_32 -o OUT.dll这时候编译器会自动关联Windows版本的
libcrypto.a和对应的头文件,不会再出现找不到文件的错误。
方案二:手动交叉编译OpenSSL源码(适合需要特定版本的情况)
如果仓库里的OpenSSL版本不符合你的需求,需要自己编译的话,关键是要用MinGW工具链交叉编译,而不是用Linux原生的gcc。步骤如下:
安装编译依赖
先确保你有MinGW工具链和必要的编译工具:sudo apt install x86_64-w64-mingw32-gcc make perl下载OpenSSL源码
下载你需要的OpenSSL版本(比如3.0.x或1.1.1系列),解压后进入源码目录。配置交叉编译环境
执行OpenSSL的Configure脚本,指定Windows 64位的交叉编译目标,同时指定MinGW的编译器:./Configure mingw64 CC=x86_64-w64-mingw32-gcc --prefix=/usr/x86_64-w64-mingw32mingw64是针对64位Windows的配置,32位的话用mingw--prefix指定安装路径,放到MinGW的系统目录里,这样编译器可以自动找到
编译并安装
make sudo make install这样编译出来的就是Windows平台的OpenSSL库和头文件,不会再出现
bits/libc-header-start.h这类Linux头文件缺失的问题——因为我们全程用的是MinGW的交叉编译器,不会去调用Linux的系统头文件。编译你的DLL
安装完成后,同样可以用你原来的编译命令,或者如果安装到了自定义路径,需要加-L指定库目录:x86_64-w64-mingw32-gcc -shared -s FILE.c FILE.def -L/path/to/your/openssl/lib -lcrypto -lws2_32 -o OUT.dll
常见问题排查
- 为什么之前自己编译OpenSSL失败?
因为你没有指定交叉编译的配置和MinGW编译器,OpenSSL默认用系统的gcc去编译,自然会找Linux的头文件,导致bits/libc-header-start.h这类错误。 - 为什么装了
libssl-dev没用?libssl-dev是给Linux原生程序用的,头文件和库都是针对Linux平台的,MinGW交叉编译无法使用。
内容的提问来源于stack exchange,提问作者George Rowland

