使用 /MD 开关构建静态版本的 OpenSSL 库

wxS*_*yan 1 openssl visual-c++

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

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

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

wxS*_*yan 7

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

注意:在以下步骤中,不要将任何内容放在名称中带有空格的目录中。

步骤 1. OpenSSL 构建脚本是使用 Perl 编写的。所以如果没有 Perl,请先安装它。我使用了Strawberry Perl的便携版。

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

步骤 3.从其网站下载最新稳定版本的 OpenSSL 源代码并解压。从干净的下载中构建 OpenSSL 是个好主意。因此,保留一份副本以供以后构建(可能具有不同的配置)。

步骤 4.打开 Strawberry Perl 便携式 shell 并转到 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 本机工具命令(根据您决定为其构建 OpenSSL 的平台)并转到 OpenSSL 源目录。然后最后运行以下命令:

制作

安装

玩得开心。特别感谢我的朋友Afshin