【问题标题】:Building a static version of OpenSSL library using /MD switch使用 /MD 开关构建静态版本的 OpenSSL 库
【发布时间】:2019-12-27 12:06:34
【问题描述】:

使用默认配置构建 OpenSSL 可为您提供动态版本的库。根据其Wiki 上的 OpenSSL 编译和安装文档,有一个名为 no-shared 的配置选项,它禁用共享对象并仅创建一个静态库。

Visual C++ 编译器将二进制文件(库或应用程序)链接到 libcmt(d).lib(使用 /MT(d) 将本机 CRT 启动静态链接到您的代码)或 msvcrt(d).lib(用于使用 /MD(d)) 与 DLL UCRT 和 vcruntime 一起使用的本机 CRT 启动。

链接本身以不同方式链接到 CRT 的二进制文件会导致冲突。不幸的是,OpenSSL 没有给我们设置这个编译器开关的选项。它总是使用 /MD 构建动态版本,使用 /MT 构建静态版本。那么,当我们有其他使用 /MD 链接的静态库(例如 Qt)时,如果我们想将它的静态版本链接到我们的应用程序,我们应该怎么做?

【问题讨论】:

    标签: visual-c++ openssl


    【解决方案1】:

    网上有一些预构建的二进制文件以这种方式链接,但总有充分的理由自己构建 OpenSSL。最重要的原因可能是出于安全考虑,或者有时您会发现这些预构建的二进制文件无法使用您想要的 Visual C++ 版本或您想要的配置进行编译。我在网上搜索过,但找不到使用 /MD 编译器开关构建静态版本 OpenSSL 的简单方法,而无需额外复杂的构建脚本。其中一些只使用旧版本的库(即 1.0.x)。所以我决定分享我的方式。

    注意:在以下步骤中,请勿将任何内容放在名称中包含空格的目录中。

    第 1 步。 OpenSSL 构建脚本是使用 Perl 编写的。因此,如果没有 Perl,请先安装它。我用的是Strawberry Perl的便携版。

    第 2 步。 根据您决定构建 OpenSSL 的平台,您需要 32 位和/或 64 位版本的 nasm 汇编器。你可以下载一份here。将所需版本添加到您的系统路径。

    第 3 步。 从其web site 下载最新稳定版本的 OpenSSL 源并解压缩。从干净的下载中构建 OpenSSL 是个好主意。所以保留一份副本以供以后构建(可能具有不同的配置)。

    第 4 步。 打开 Strawberry Perl 便携外壳并转到 OpenSSL 源目录。

    第 5 步。 使用以下命令创建 OpenSSL make 文件:

    perl 配置平台 [options] [--debug] --prefix=absolute_path --openssldir=same_path

    • 平台可以是VC-WIN32、VC-WIN64A等

    • 对我来说一些有趣的选择:

      • no-shared:禁用共享对象(仅创建静态库)
      • no-stdio:不要使用 C 头文件“stdio.h”中使用“FILE”类型的任何内容。使用此选项,您无需将最终二进制文件链接到 crypt32.lib。
      • no-sock:不构建对套接字 BIO 的支持。使用此选项,您无需将最终二进制文件链接到 Ws2_32.lib。
    • 根据 OpenSSL Compilation and Installation 文档,当您想要对所有最新版本的 OpenSSL(包括 OpenSSL 1.0.2 和 1.1.0)“正常工作”的东西时,请同时指定 --prefix 和 --openssldir 并将两者都设置为同一地点。

    第 6 步。 在 OpenSSL 源目录下,打开 makefile 并找到 LIB_CFLAGS。根据您是否编译发布版本,将 /MT 更改为 /MD 或 /MDd。您可以将调试信息(pdb 文件的内容)链接到您的库。为此删除 /Fdossl_static 并将 /Zl 编译器开关更改为 /Z7。

    第 7 步。 运行 Visual Studio x86/x64 Native Tools 命令(根据您决定为其构建 OpenSSL 的平台)并转到 OpenSSL 源目录。然后最终运行以下命令:

    nmake

    nmake 安装

    享受你的时间。特别感谢我的朋友Afshin

    【讨论】:

    • 很好的说明。我认为删除 /Fdossl_static 并更改 /ZI 的地方有一个小写 L,并且可能不存在 switch。同样在我正在构建的 1.1.0h 中,/M 开关不在 LIB_CFLAGS 行上。我在 CFLAGS 和 BIN_CFLAGS 中找到了它。我也将它添加到 LIB_CFLAGS 中。
    • 我的快速破解正在更改 util/pl/VC-32.pl 的第 48 行以强制 /MD:my $f = ' /MD';
    • 值得注意的是,当我尝试从 VS2015 x64 Native Tools Command 构建时出现错误(找不到 rc)(顺便说一句,您可以在开始菜单中找到这些),但在使用 VS2017 x64 Native 时它可以工作工具命令。
    【解决方案2】:

    在构建“共享”版本时查看以 *_static.lib 结尾的文件。对于 OpenSSL 1.1,这是 libcrypto_static.lib 和 libssl_static.lib。

    【讨论】:

      猜你喜欢
      • 2012-04-25
      • 1970-01-01
      • 2018-10-05
      • 1970-01-01
      • 2020-03-22
      • 1970-01-01
      • 1970-01-01
      • 2016-12-23
      • 2011-05-12
      相关资源
      最近更新 更多