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

2024-01-08

我正在开发一个使用 OpenSSL 1.0.1e 库的 Windows C++ 应用程序。我使用的是 Visual Studio 2008。

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

Per the OpenSSL 常见问题解答 http://www.openssl.org/support/faq.html,该库默认链接到多线程 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对我来说真的不起作用。

如何构建 OpenSSL/MT or /MTd选项?


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

  • 适用于 Windows 的 Git。您可以在以下位置下载:https://git-scm.com/download/win https://git-scm.com/download/win。本指南使用版本2.11.0.3 https://github.com/git-for-windows/git/releases/download/v2.11.0.windows.3/Git-2.11.0.3-64-bit.exe.
  • 草莓珍珠。您可以在以下位置下载:http://strawberryperl.com/ http://strawberryperl.com/(警告:强烈不推荐 ActivePerl。它will在此过程中给你带来奇怪的错误)。本指南使用版本5.24.1.1 http://strawberryperl.com/download/5.24.1.1/strawberry-perl-5.24.1.1-64bit.msi.
  • NASM 汇编器,可从http://www.nasm.us/ http://www.nasm.us/。本指南使用版本 2.12.03rc1 http://www.nasm.us/pub/nasm/releasebuilds/2.12.03rc1/win64/nasm-2.12.03rc1-installer-x64.exe.

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

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

  1. Open VS2015 x64 本机工具命令提示符从你的开始菜单。您将看到命令提示符。
  2. Create C:\build目录并在命令提示符中发出以下命令:

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

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

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

      1. 找到以以下内容开头的行CFLAGS
      2. Replace -MD with -GL -MT -Zc:wchar_t-
      3. 找到以以下内容开头的行LDFLAGS
      4. Replace -debug with -opt:icf -dynamicbase -nxcompat -ltcg /nodefaultlib:msvcrt
  5. Build 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) from C:\Windows\目录。

    • perl Configure VC-WIN64A no-shared zlib no-zlib-dynamic threads --prefix=C:\Windows\
  8. 现在对以下内容进行编辑C:\build\openssl\makefile:

    • 找到以以下内容开头的行:CFLAG
    • Append: /Zc:wchar_t- /GL /Zi
    • 找到以以下内容开头的行:LDFLAGS
    • Replace /debug with /incremental:no /opt:icf /dynamicbase /nxcompat /ltcg /nodefaultlib:msvcrt
    • 找到以以下内容开头的行:EX_LIBS
    • Replace ZLIB1 with zlib.lib
    • 保存更改
  9. Build OpenSSL通过发出nmake命令(大约需要 15 分钟)。

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何构建针对 Windows 运行时静态链接的 OpenSSL? 的相关文章

  • 捕获 .aspx 和 .ascx 页面中的异常

    问题说明了一切 请看以下示例代码 ul li li ul
  • 为什么 C 程序使用 Scanf 给出奇怪的输出?

    我目前正在学习 C 编程 并且遇到了这个奇怪的输出 Program will try functionalities of the scanf function include
  • C# 中的 Stack<> 实现

    我最近一直在实现递归目录搜索实现 并且使用堆栈来跟踪路径元素 当我使用 string Join 连接路径元素时 我发现它们被颠倒了 当我调试该方法时 我查看了堆栈 发现堆栈内部数组中的元素本身是相反的 即最近 Push 的元素位于内部数组的
  • strlen() 编译时优化

    前几天我发现你可以找到编译时strlen使用这样的东西 template
  • Boost ASIO 串行写入十六进制值

    我正在使用 ubuntu 通过串行端口与设备进行通信 所有消息都必须是十六进制值 我已经在 Windows 环境中使用白蚁测试了通信设置 并得到了我期望的响应 但在使用 Boost asio 时我无法得到任何响应 以下是我设置串口的方法 b
  • 如何在 C# 中将 Json 转换为对象

    我想将 Json 转换为 C 中的对象 这里的 Json 是 值 e920ce0f e3f5 4c6f 8e3d d2fbc51990e4 如何使用 Object 问题看似愚蠢 但其实并不那么愚蠢 我没有简单的 Json 我有 IEnume
  • 如何修复错误:“检测到无法访问的代码”

    我有以下代码 private string GetAnswer private int CountLeapYears DateTime startDate return count String answer GetAnswer Respo
  • 用于在标头更改时重新编译的简单 C 项目的示例 makefile

    有谁有完整的 makefile 可以执行以下操作 如果 HEADER 文件发生更改 则重建项目 cpp 文件在 makefile 中列出 头文件未在 makefile 中列出 头文件允许与 cpp 文件具有不同的名称 部分cpp文件没有头文
  • JavaScript 错误:MVC2 视图中的条件编译已关闭

    我试图在 MVC2 视图页面中单击时调用 JavaScript 函数 a href Select a JavaScript 函数 function SelectBenefit id code alert id alert code 这里 b
  • 来自嵌入图像的 BitmapSource

    我的目标是在 WPF 窗口上重写 OnRender 方法中绘制图像 someImage png 它是嵌入资源 protected override void OnRender System Windows Media DrawingCont
  • wordexp 失败时我们需要调用 wordfree 吗?

    wordexp 失败时我们需要调用 wordfree 吗 在某些情况下 调用 wordfree 似乎会出现段错误 例如 当 wordfree 返回字符串为 foo bar 的错误代码时 这在手册页中并不清楚 我已经看到在某些错误情况下使用了
  • 在提交到 Mac App Store 的应用程序中调用 openssl 是否可以接受?

    我有点不清楚调用提交到 App Store 的应用程序之外的进程的规则是什么 我读到 如果您想使用 Cocoa 和 OSX 库之外的其他库 框架 您必须将其包含在您的应用程序中 例如 如果使用 QT Python 或 Ruby 编写应用程序
  • 读取依赖步行者输出

    I am having some problems using one of the Dlls in my application and I ran dependency walker on it i am not sure how to
  • Xamarin Forms Binding - 访问父属性

    我无法访问页面的 ViewModel 属性以便将其绑定到 IsVisible 属性 如果我不设置 BindingContext 我只能绑定它 有没有办法可以在设置 BindingContext 的同时访问页面的 viewmodel root
  • 调用 .ToArray() 时出现 ArgumentException

    我有一个经常被清除的列表 代码完全是这样的 VisitorAgent toPersist List
  • 如何编写一个接受 int 或 float 的 C 函数?

    我想用 C 语言创建一个扩展 Python 的函数 该函数可以接受 float 或 int 类型的输入 所以基本上 我想要f 5 and f 5 5 成为可接受的输入 我认为我不能使用if PyArg ParseTuple args i v
  • Windows 10:任务栏中的图标大小错误

    从 Windows 10 开始 任务栏中的图标大小似乎为 24x24px 如果 Windows 选择图标文件中的 24px 版本进行显示 那么这不会有问题 但它选择了 32px 版本并将其缩小 这会导致丑陋的伪像 尤其是当你的图标中有直线时
  • 如何组合两个 lambda [重复]

    这个问题在这里已经有答案了 可能的重复 在 C 中组合两个 lambda 表达式 https stackoverflow com questions 1717444 combining two lamba expressions in c
  • Streamwriter 覆盖 txt 文件中的文本

    有没有什么方法可以重新打开流写入器而不创建新的写入对象 因为此时 当调用 WriteOdd 时 streamwriter 正在覆盖在它之前调用的 WriteEven public void WriteEven StreamWriter wr
  • winform c# 中的弹出窗口

    我正在开发一个需要弹出窗口的项目 但问题是我还希望能够通过表单设计器在此弹出窗口中添加文本框等 所以基本上我有一个按钮 当您单击它时 它将打开我在表单设计器中设计的另一个窗口 我一直在谷歌搜索 但还没有找到我需要的东西 所以我希望你们能帮助

随机推荐