Windows平台的注意:
Windows目标可以归类为“本机”,即直接使用Windows API和依赖POSIX兼容层“托管”。
“本机”归结于VC-*(其中“VC”源于缩写Microsoft Visual C编译器)和MinGW[64]。
“托管”平台是Cygwin和MSYS[2]。 甚至虽然后者([2])不是OpenSSL团队直接支持的,但它是Cygwin#1建立MinGW目标的热门选择。 简而言之,MinGW构建总是交叉编译。
在Linux和 Cygwin 上,它们看起来完全一样,并要求--cross-compile-prefix选项。
在MSYS 2上,通过替换GCC编译器,它已经解决了在$PATH上生成“MinGW二进制”代码。
这通常是混乱的根源。
“托管”应用程序“寄宿”于模拟文件系统命名空间,像POSIX-y root,在挂载点/dev甚至/proc。
事实上,MSYS2 shell的造成了更大的混乱(或者更确切地说是模拟execve(2)调用)因为二进制文件即将运行时,它会进行检测,
如果发现*不*与MSYS2 POSIX-y链接,看起来像文件名的命令行参数会将模拟文件命名空间翻译为“本机”能识别的。
例如:'/c/some/where'变为'c:\some\where','/dev/null'变为'nul'。
这造成了一种错觉MSYS2 shell和“MinGW二进制”之间没有区别,但是事实是有。
请记住,“MinGW二进制文件”“体验”Windows系统与VC生成的系统完全相同,但两者本质切无法区分。 (顺便说一句,这就是为什么它在引用中引用为“MinGW二进制”,因为它就只能活在“本机”,就和应为native这个单词一样。)
翻译完之后感觉作者好像对windows很多不满哦
备注:
MinGW是什么?
MinGW是是将GCC编译器和GNU Binutils移植到Win32平台下的产物,包括一系列头文件(Win32API)、库和可执行文件。GCC支持的语言大多在MinGW也受支持,其中涵盖C、C++、Objective-C、Fortran及Ada。对于C语言之外的语言,MinGW使用标准的GNU运行库,如C++使用GNU libstdc++。但是MinGW使用Windows中的C运行库。因此用MinGW开发的程序不需要额外的第三方DLL支持就可以直接在Windows下运行,而且也不一定必须遵从GPL许可证。这同时造成了MinGW开发的程序只能使用Win32API和跨平台的第三方库,而缺少POSIX支持[3],大多数GNU软件无法在不修改源代码的情况下用MinGW编译。具体细节可看官方网站。
MinGW 和 Cygwin 的关系?
MinGW是从Cygwin(1.3.3版)基础上发展而来。Cygwin是一个在windows平台上运行的类UNIX模拟环境。
MSYS是什么?
Minimal GNU(POSIX)system on Windows,是一个小型的GNU环境,包括基本的bash,make等等。与Cygwin大致相当。
Visual C++ 编译, a.k.a. VC-*
先决条件:
除了INSTALL中列出的要求和说明外,
这些也是必需的:
- Perl我们建议使用ActiveState Perl
https://www.activestate.com/ActivePerl。
另一种可行的选择是Strawberry Perl(士多俾梨 Perl),http://strawberryperl.com。
您还需要CPAN上提供的perl模块Text::Template。
有关更多信息,请阅读NOTES.PERL。
- Microsoft Visual C编译器。因为我们无法全部测试,所以有
关于支持哪些版本的不可避免的不确定性。最新
肯定支持版本以及之前的几个版本。上
另一方面,最古老版本已经不能编译了。
如果存在任何意外,那也属于尽力而为的范畴之外了。(作者这句英文实在难翻译)
- Netwide Assembler,a.k.a。NASM,可从https://www.nasm.us获得,
是必须的。请注意,NASM是唯一受支持的汇编程序。甚至
虽然微软提供的汇编程序不受支持,但通过持续集成VC-WIN64A-masm使得现代64位版本可以运行为目标。
安装指导:
默认的安装目录来源于环境变量。
对于VC-WIN32,使用以下默认值:
PREFIX:%ProgramFiles(86)%\ OpenSSL
OPENSSLDIR:%CommonProgramFiles(86)%\ SSL
对于VC-WIN64,使用以下默认值:
PREFIX:%ProgramW6432%\ OpenSSL
OPENSSLDIR:%CommonProgramW6432%\ SSL
这些环境变量是否应该存在(在纯Win32上)安装例子),使用这些后备:
PREFIX:%ProgramFiles%\ OpenSSL
OPENSSLDIR:%CommonProgramFiles%\ SSL
另请注意,即使这些目录通常也是写保护的,
尽管您的帐户位于Administrators组中,为了能良好的工作,
您也要通过右键单击“以管理员运行“启动控制台运行'nmake install'之前。另一个解决方案
当然,通过配置--prefix和--openssldir使用一组不同的目录。
mingw and mingw64
* MSYS2 shell和开发环境安装:
从https://msys2.github.io/下载MSYS2并按照安装说明进行操作。
一旦启动并运行安装,有可能甚至make,perl,(git,如果需要),mingw-w64-i686-gcc和mingw-w64-x86_64-gcc等都需要安装。
你应该在开始菜单上有相应的MinGW项目,使用*它们*,而不是通用的MSYS2。
正如开篇中所暗示的那样,它们之间的差异是在$PATH环境变量上找到第一个编译器。
此时./config应该识别正确的目标,它就好像在Unix正确运行了...
*也可以在Linux或Cygwin上构建mingw [64]
使用相应的--cross-compile-prefix =选项进行配置。 对于
例
./Configure mingw --cross-compile-prefix = i686-w64-mingw32- ...
要么
./Configure mingw64 --cross-compile-prefix = x86_64-w64-mingw32- ...
这自然意味着您已经安装了相应的附加组件包。
链接您的应用程序
本节适用于所有“本机”构建。
如果您链接到静态OpenSSL库,那么您应该将您的应用程序链接到WS2_32.LIB,GDI32.LIB,ADVAPI32.LIB,CRYPT32.LIB和USER32.LIB。
那些正在开发非交互式服务应用程序可能会感到担心与GDI32.LIB和USER32.LIB链接,
因为它们与交互式桌面关联的使用,不属于开发范畴。
该工具包旨在检测它的运行环境,GUI,控制台应用程序或服务,并相应地采取行动,即是否实际进行GUI调用(意思是如果没有GUI调用则不会调用的,请放心吧)。
另外那些使用/DELAYLOAD:GDI32.DLL和/DAYAYLOAD:USER32.DLL延迟加载和
实际上,让他们关闭服务过程应该考虑实现并从.exe图像导出自己的_OPENSSL_isservice函数没有依赖于USER32.DLL。
例如,在Windows Vista及更高版本中,您可以:
__declspec(dllexport)__ cdecl BOOL _OPENSSL_isservice(void)
{
DWORD sess;
if(ProcessIdToSessionId(GetCurrentProcessId(),&sess))
return sess == 0;
return FALSE;
}
如果您与OpenSSL.DLLs链接,那么您应该包括你的应用程序代码小“shim”片段,
它提供之间的粘合剂OpenSSL BIO层和编译器运行时。请参阅OPENSSL_Applink手册页了解更多详情。
Cygwin,“托管”环境
Cygwin实现了一个Posix / Unix运行时系统(cygwin1.dll)Windows子系统并提供了一个bash shell和GNU工具环境。
因此,使用Cygwin的OpenSSL几乎与之相同Unix程序。
要使用Cygwin构建OpenSSL,您需要:
*安装Cygwin(参见https://cygwin.com/)
*安装Cygwin Perl并确保它在路径中。版本至少需要5.10.0。
*运行Cygwin bash shell
除此之外,请按照INSTALL中的Unix说明进行操作。
注意:“make test”和正常文件可能操作失败,在目录中由于Cygwin而挂载为文本剥离回车(即,mount -t c:\somewhere /home)
。为了避免这种情况,请确保二进制使用mount,例如mount -b c:\somewhere /home。