使用msys2在Windows上编译openssl-1.1.0e

使用msys2在Windows上编译openssl-1.1.0e,openssl,mingw,msys2,Openssl,Mingw,Msys2,在我的Windows7VM上编译openssl-1.1.0e是一条艰难的道路 首先,从msys2外壳内部使用以下命令的一些msys2包 pacman -S make gcc perl 源配置为 ./Configure mingw 然后, 文件有问题 crypto/init.c crypto/dso/dso_win32.c 两人都抱怨Windows的功能。添加 #include <windows.h> 老实说,我真是不知所措。有什么想法吗?应该没有理由对OpenSSL源代码进行

在我的Windows7VM上编译openssl-1.1.0e是一条艰难的道路

首先,从msys2外壳内部使用以下命令的一些msys2包

pacman -S make gcc perl
源配置为

./Configure mingw
然后,

文件有问题

crypto/init.c
crypto/dso/dso_win32.c
两人都抱怨Windows的功能。添加

#include <windows.h>

老实说,我真是不知所措。有什么想法吗?

应该没有理由对OpenSSL源代码进行更改以使其与mingw/msys2一起工作。它编译得很好,没有这样的更改-您的问题几乎肯定是环境问题。获取OpenSSL源代码的干净副本,然后检查以下内容

在您的问题中,我注意到您已经安装了msys2 gcc。这很可能是你问题的根源。进行mingw构建的全部要点是使用mingw编译器生成本机windows可执行文件/库。确保mingw编译器在任何msys2编译器之前出现在您的路径上,您甚至可能只想删除msys2 gcc包

需要注意的第二件事是,配置脚本实际上有两个不同的mingw目标:mingw和mingw64。您需要确保您使用的是正确的,并且它与您使用的mingw编译器版本相匹配

要检查的另一件事是perl版本。有时,根据您的路径,您可能会选择错误的perl版本,即使您已经安装了msys2 perl。如果在msys2实例之前的路径上存在不同版本的perl,则可能会出现问题。从msys2 shell中执行perl-v,并检查它是否如下所示:


这是为x86_64-msys-thread-multi构建的perl 5,版本22,subversion 1 v5.22.1,为什么不使用pacman安装openssl?如果您真的想自己构建它,那么应该使用作为起点。
#include <windows.h>
make[2]: Entering directory '/builds/openssl-1.1.0e'
perl ./util/mkrc.pl libcrypto-1_1.dll | windres --target=pe-i386 -o rc.o
LD_LIBRARY_PATH=: gcc -DOPENSSL_USE_APPLINK -DDSO_WIN32 -DNDEBUG -DOPENSSL_THREADS -DOPENSSL_NO_STATIC_ENGINE -DOPENSSL_PIC  -DOPENSSL_BN_ASM_PART_WORDS -DOPENSSL_IA32_SSE2 -DOPENSSL_BN_ASM_MONT -DOPENSSL_BN_ASM_GF2m -DSHA1_ASM -DSHA256_ASM -DSHA512_ASM -DRC4_ASM -DMD5_ASM -DRMD160_ASM -DAES_ASM -DVPAES_ASM -DWHIRLPOOL_ASM -DGHASH_ASM  -DECP_NISTZ256_ASM -DPADLOCK_ASM -DPOLY1305_ASM -DOPENSSLDIR="/usr/local/ssl" -DENGINESDIR="/usr/local/lib/engines-1_1" -DL_ENDIAN -DWIN32_LEAN_AND_MEAN -DUNICODE -D_UNICODE -m32 -Wall -O3 -fomit-frame-pointer -D_MT -D_WINDLL -static-libgcc -shared -Wl,-Bsymbolic -Wl,--out-implib,libcrypto.dll.a crypto.def rc.o -o ./libcrypto-1_1.dll -Wl,--whole-archive ./libcrypto.a -Wl,--no-whole-archive -lws2_32 -lgdi32 -lcrypt32
Cannot export RAND_event: symbol not defined
Cannot export RAND_screen: symbol not defined
./libcrypto.a(uplink.o):uplink.c:(.text+0x5e): undefined reference to `_sntprintf'
./libcrypto.a(uplink.o):uplink.c:(.text+0x75): undefined reference to `_tcscpy'
./libcrypto.a(uplink.o):uplink.c:(.text+0xcd): undefined reference to `_tcscpy'
./libcrypto.a(uplink.o):uplink.c:(.text+0x14e): undefined reference to `_tcscpy'
./libcrypto.a(uplink.o):uplink.c:(.text+0x179): undefined reference to `_tcscpy'
collect2: error: ld returned 1 exit status
make[2]: *** [Makefile.shared:296: link_shlib.mingw] Error 1
make[2]: Leaving directory '/builds/openssl-1.1.0e'
make[1]: *** [Makefile:725: libcrypto.dll.a] Error 2
make[1]: Leaving directory '/builds/openssl-1.1.0e'
make: *** [Makefile:128: all] Error 2