如何构build静态链接到Windows运行时的OpenSSL?

我正在使用OpenSSL 1.0.1e库的Windows的C ++应用程序。 我在Visual Studio 2008上。

出于便携性原因,我的应用程序与运行时库( /MT/MTd选项)静态链接。 而且我没有运行我的应用程序运行库。

根据OpenSSL FAQ ,该库默认与multithreadingDLL运行时( /MDd )链接,这显然与我的scheme不兼容。 所以为了使我的程序工作,我已经添加了applink.c到我的项目。 在我的开发机器和大多数testing计算机上,程序工作正常。

但不幸的是,我find了应用程序无法启动的计算机。 Windows显示错误:

 The application failed to initialize properly (0xc0150002). Click on OK to terminate the application. 

我在Dependency Walker中打开了libeay32.dll ,发现MSVCR90.dll没有find。 所以applink.c的窍门并不适合我。

如何使用/MT/MTd选项构buildOpenSSL?

使用nt.mak生成文件而不是ntdll.mak生成文件。

另外,我已经编写了一些围绕标准OpenSSL构建脚本的脚本,这些脚本使得在Windows上同时使用x86和x64的OpenSSL更容易(至少对我来说),您可以从这里获得它们。

我在Windows上找到的最优雅的选项包括使用http://p-nand-q.com/programming/windows/building_openssl_with_visual_studio_2013.html中提供的脚本

他们为每个脚本版本提供了VS2010 / VS2013 / VS2015的脚本,它构建了x86 / x86-64与运行时MDd / MD / MTd / MT的所有组合。

引用说明:

先决条件:

该脚本假定您在Windows上。

该脚本假定您在所有常用的位置安装了Visual Studio 2010,2013或2015。 重要提示:如果您有不同的安装文件夹,您的里程可能会有所不同

脚本假定你已经下载了一个OpenSSL tarball,像这样。

该脚本假定您已经安装了Python(2.7或3.x)并且在您的PATH上

该脚本假定您已经安装了7-zip(不需要在您的PATH上)选择您要使用的脚本并进行编辑。 例如,让我们看一下rebuild_openssl_vs2015.cmd的顶部:

T:

设置OPENSSL_VERSION = 1.0.1p

设置SEVENZIP =“C:\ Program Files \ 7-Zip \ 7z.exe”

设置VS2015 =“C:\ Program Files(x86)\ Microsoft Visual Studio 14.0 \ VC \ bin \ vcvars32.bat”

设置VS2015_AMD64 =“C:\ Program Files(x86)\ Microsoft Visual Studio 14.0 \ VC \ bin \ amd64 \ vcvars64.bat”

所以很容易看到:你必须手动输入OpenSSL版本,其余的应该有合理的默认值…

注意:该脚本使用SUBST T:\驱动器来构建OpenSSL。

我测试了它,在不到10分钟内就可以正常工作! KUDOS的脚本的作者!

更新:对于要生成的x64版本,您需要安装nasm汇编程序并将其放在PATH中。

如果你想要使用MT预编译的OpenSSL库,请看这里: http : //www.npcglib.org/~stathis/blog/precompiled-openssl/你将会找到一个OpenSSL源代码补丁,它能够生成带有后缀MT / MD的库和“ d“进行调试,以便更容易地识别库。

更重要的是,您还可以找到实际的构建脚本,为许多不同版本的Visual Studio一次构建所有这些脚本。 我自己构建和使用它们来准确地生成不需要任何DLL的二进制文件,您可能会发现它们很有用。

要使用Visual Studio 2015构建64位OpenSSL静态链接(导致一个.exe文件没有任何DLL),您将需要以下先决条件:

您需要在系统范围内安装所有这些工具,并将它们添加到您的%PATH%环境变量中。

当你得到我们需要的一切后,只需按照下面的简单步骤:

  1. 从开始菜单打开VS2015 x64本地工具命令提示符 你会看到命令提示符。
  2. 创建C:\build目录并在命令提示符下发出以下命令:

    • cd c:\build
  3. 通过使用以下命令将最新的zlib和OpenSSL源代码下载到您的build目录中:

    • git clone https://github.com/madler/zlib
    • git clone https://github.com/openssl/openssl
  4. 首先,我们必须建立静态zlib 要做到这一点,我们将需要编辑一些配置文件:

    • 导航到zlib源文件夹: cd C:\build\zlib
    • 编辑win32\Makefile.msc文件:

      1. 找到从CFLAGS开始的行
      2. -MD替换为-GL -MT -Zc:wchar_t-
      3. 找到以LDFLAGS开头的行
      4. -opt:icf -dynamicbase -nxcompat -ltcg /nodefaultlib:msvcrt替换-debug -opt:icf -dynamicbase -nxcompat -ltcg /nodefaultlib:msvcrt
  5. 使用以下命令构建zlib (应该少于一分钟):

    • nmake -f win32/Makefile.msc AS=ml64 LOC="-DASMV -DASMINF -DNDEBUG -I." OBJA="inffasx64.obj gvmat64.obj inffas8664.obj"
  6. 将结果文件复制到您的OpenSSL目录中:

    • xcopy zlib.h C:\build\openssl\
    • xcopy zconf.h C:\build\openssl\
    • xcopy zlib.lib C:\build\openssl\
    • xcopy zlib.pdb C:\build\openssl\
  7. 导航到OpenSSL源代码: cd C:\build\openssl\并将其配置为使用静态zlib并从C:\Windows\目录读取配置文件( openssl.cnf )。

    • perl Configure VC-WIN64A no-shared zlib no-zlib-dynamic threads --prefix=C:\Windows\
  8. 现在对C:\build\openssl\makefile进行以下编辑:

    • 找到以CFLAG开头的行
    • 追加: /Zc:wchar_t- /GL /Zi
    • 找到以LDFLAGS开头的行
    • /incremental:no /opt:icf /dynamicbase /nxcompat /ltcg /nodefaultlib:msvcrt替换/debug /incremental:no /opt:icf /dynamicbase /nxcompat /ltcg /nodefaultlib:msvcrt
    • 找到以EX_LIBS开头的行
    • ZLIB1替换zlib.lib
    • 保存更改
  9. 通过发出nmake命令来建立OpenSSL (大约需要15分钟)。

生成的〜3MB openssl.exe文件将位于C:\build\openssl\apps\目录下。 它是完全可移植的,因为所有的DLL都包含在内。 如果您需要使用自定义配置文件,请将C:\build\openssl\apps\openssl.cnf复制到您的C:\Windows\目录并根据自己的喜好进行编辑。