10

我正在为使用 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. 

libeay32.dll在 Dependency Walker中打开过,MSVCR90.dll但发现没有找到。所以这个技巧applink.c对我来说真的不起作用。

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

4

5 回答 5

7

使用nt.makmakefile 而不是ntdll.makmakefile。

顺便说一句,我围绕标准 OpenSSL 构建脚本编写了一些脚本,这使得在 Windows 上使用 x86 和 x64 混合的 OpenSSL 变得“更容易”(至少对我而言),你可以从这里获得它们。

于 2013-08-28T11:36:19.833 回答
4

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

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

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

  1. 从开始菜单打开VS2015 x64 Native Tools 命令提示符。您将看到命令提示符。
  2. 创建C:\build目录并在命令提示符下发出以下命令:

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

    • git clone https://github.com/madler/zlib
    • git clone https://github.com/openssl/openssl
  4. 首先,我们必须构建 static zlib。首先,我们需要编辑一些配置文件:

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

      1. 找到以CFLAGS
      2. 替换-MD-GL -MT -Zc:wchar_t-
      3. 找到以LDFLAGS
      4. 替换-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. 导航到OpenSSLsource: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
    • 替换ZLIB1zlib.lib
    • 保存更改
  9. OpenSSL通过发出命令构建nmake(大约需要 15 分钟)。

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

于 2017-01-23T21:13:42.543 回答
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 压缩包,例如这个。

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

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

电话:

设置 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 分钟就可以了!为脚本作者点赞!!

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

于 2016-02-18T23:45:20.440 回答
2

如果您想使用 MT 预编译 OpenSSL 库,请查看此处:http ://www.npcglib.org/~stathis/blog/precompiled-openssl/ 您将找到 OpenSSL 源的补丁程序,该补丁程序可以生成后缀为 MT/MD 和“ d" 进行调试,以便更轻松地识别库。

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

于 2014-09-22T10:50:53.097 回答
0

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

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

于 2018-08-29T01:25:08.447 回答