如何构建与Windows运行时静态链接的OpenSSL?

时间:2013-08-28 11:10:29

标签: c windows openssl static-libraries static-linking

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

出于可移植性的原因,我的应用程序与运行时库(/MT/MTd选项)静态链接。我不会在我的应用程序中发布运行时库。

根据OpenSSL FAQ,默认情况下,库与多线程DLL运行时(/MDd)链接,这显然与我的场景不兼容。为了使我的计划有效,我已将applink.c添加到我的项目中。在我的开发机器和大多数测试计算机上,程序运行正常。

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

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

我在Dependency Walker中打开libeay32.dll,我发现找不到MSVCR90.dll。所以applink.c的诀窍并不适合我。

如何使用/MT/MTd选项构建OpenSSL?

5 个答案:

答案 0 :(得分:6)

使用nt.mak makefile而不是ntdll.mak makefile。

顺便说一句,我已经围绕标准的OpenSSL构建脚本编写了一些脚本,这使得“(至少对我来说)在Windows上使用OpenSSL同时使用x86和x64”更容易“,你可以从{ {3}}

答案 1 :(得分:3)

我找到的最优雅的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(无需启用   您的路径)选择您要使用的脚本并进行编辑。例如,   让我们来看看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中。

答案 2 :(得分:1)

如果您想要使用MT预编译的OpenSSL库,请查看:http://www.npcglib.org/~stathis/blog/precompiled-openssl/ 您将找到OpenSSL源代码的补丁,它可以生成带有后缀MT / MD的库和用于调试的“d”,以便更容易识别库。

此外,您还将找到实际的构建脚本,以便为许多不同版本的Visual Studio一次构建所有这些脚本。我自己构建和使用它们来完全生成不需要我的项目的DLL的二进制文件,你可能会觉得它们很有用。

答案 3 :(得分:1)

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

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

获得我们需要的一切后,只需按照以下简单步骤操作:

  1. 从“开始”菜单中打开 VS2015 x64 Native Tools命令提示符。您将看到命令提示符。
  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. 开头的行
      3. -MD替换为-GL -MT -Zc:wchar_t-
      4. 找到以LDFLAGS
      5. 开头的行
      6. -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&从openssl.cnf目录中读取配置文件(C:\Windows\)。

    • 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
    • 开头的行
    • /debug替换为/incremental:no /opt:icf /dynamicbase /nxcompat /ltcg /nodefaultlib:msvcrt
    • 找到以:EX_LIBS
    • 开头的行
    • ZLIB1替换为zlib.lib
    • 保存更改
  9. 通过发出OpenSSL命令构建nmake(大约需要15分钟)。

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

答案 4 :(得分:0)

似乎OpenSSL现在与-MT -Zl链接(至少在使用msvc时),这意味着它将丢弃默认的命名库,这些库随后在最终的二进制文件中确定。默认情况下,应用程序似乎使用静态运行时。

换句话说,无需采取任何措施即可将其与二进制文件一起使用,只需提供所需的任何标志,OpenSSL库即可使用它。不幸的是,关于建立如此重要的库,没有很多具体的文档。