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

时间:2018-05-16 08:08:16

标签: visual-c++ openssl

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

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

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

2 个答案:

答案 0 :(得分:1)

网上有一些预先建立的二进制文件可以通过这种方式链接,但总有一个很好的理由可以自己构建OpenSSL。最重要的原因可能是安全性考虑因素,或者有时您会发现这些预构建的二进制文件无法使用所需的Visual C ++版本或所需的配置进行编译。我在Web上搜索过但是找不到使用/ 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:禁用共享对象(只有静态库是crhttps://stackoverflow.com/editing-helpeated)
    •   
    • no-stdio:不要使用使用“FILE”类型的C头文件“stdio.h”中的任何内容。使用此选项可以将您的最终二进制文件链接到crypt32.lib。
    •   
    • no-sock:不建立对套接字BIO的支持。使用此选项可以将您的最终二进制文件链接到Ws2_32.lib。
    •   
  •   
  • 根据OpenSSL编译和安装文档,如果您想要为所有最新版本的OpenSSL“正常工作”,包括OpenSSL 1.0.2和1.1.0,请同时指定--prefix和--openssldir将两者都设置在同一位置。

  •   

步骤6。在OpenSSL源目录下,打开makefile并找到LIB_CFLAGS。根据您是否编译发布版本,将/ MT更改为/ MD或/ MDd。您可以将调试信息(pdb文件的内容)链接到库。对于这个remove / Fdossl_static和change / Zl编译器切换到/ Z7。

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

  

NMAKE

     

nmake install

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

答案 1 :(得分:0)

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