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

ibps3vxo  于 2023-02-21  发布在  Windows
关注(0)|答案(6)|浏览(170)

我正在开发一个使用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.

我已经在Dependency步行者中打开了libeay32.dll,但是没有找到MSVCR90.dll,所以applink.c的技巧对我来说并不管用。
如何使用/MT/MTd选项构建OpenSSL?

eulz3vhy

eulz3vhy1#

使用nt.mak生成文件,而不是ntdll.mak生成文件。
顺便说一句,我已经围绕标准OpenSSL构建脚本编写了一些脚本,这些脚本使在x86和x64混合的Windows上使用OpenSSL变得“更容易”(至少对我来说),您可以从here获得它们。

zxlwwiss

zxlwwiss2#

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

您需要在系统范围内安装所有这些工具,并将它们添加到%PATH%环境变量中。
在你得到了我们需要的一切,只是按照这个简单的步骤:
1.从开始菜单打开 * VS2015 x64本机工具命令提示符 *。您将看到命令提示符。

  • 创建C:\build目录并在命令提示符下发出以下命令:
  • cd c:\build
  • 使用以下命令将最新的zlib和OpenSSL源代码下载到build目录:
  • git clone https://github.com/madler/zlib
  • git clone https://github.com/openssl/openssl

1.首先,我们需要构建静态的zlib。为此,我们需要编辑一些配置文件:

  • 导航到zlib源文件夹:cd C:\build\zlib

1.编辑win32\Makefile.msc文件:
1.查找以CFLAGS开头的行
1.将-MD替换为-GL -MT -Zc:wchar_t-
1.查找以LDFLAGS开头的行
1.将-debug替换为-opt:icf -dynamicbase -nxcompat -ltcg /nodefaultlib:msvcrt

  • 使用以下命令构建zlib(应该不到一分钟):
  • nmake -f win32/Makefile.msc AS=ml64 LOC="-DASMV -DASMINF -DNDEBUG -I." OBJA="inffasx64.obj gvmat64.obj inffas8664.obj"
  • 将生成的文件复制到OpenSSL目录:
  • xcopy zlib.h C:\build\openssl\
  • x1米20英寸1x
  • xcopy zlib.lib C:\build\openssl\
  • xcopy zlib.pdb C:\build\openssl\
  • 导航至OpenSSL源代码:cd C:\build\openssl\并将其配置为使用静态zlib &从C:\Windows\目录读取配置文件(openssl.cnf)。
  • perl Configure VC-WIN64A no-shared zlib no-zlib-dynamic threads --prefix=C:\Windows\
  • 现在对C:\build\openssl\makefile进行以下编辑:
  • 查找以以下内容开头的行:CFLAG
  • 追加:/Zc:wchar_t- /GL /Zi
  • 查找以以下内容开头的行:LDFLAGS
  • /debug替换为/incremental:no /opt:icf /dynamicbase /nxcompat /ltcg /nodefaultlib:msvcrt
  • 查找以以下内容开头的行:EX_LIBS
  • ZLIB1替换为zlib.lib
  • 保存更改
  • 通过发出nmake命令构建OpenSSL(大约需要15分钟)。

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

lzfw57am

lzfw57am3#

我所找到的最优雅的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(不需要在你的路径上)选择你想要使用的脚本并编辑它。例如,让我们看看rebuild_openssl_vs2015.cmd的顶部:
T:
设置OPENSSL版本= 1.0.1p
设置SEVENZIP ="C:\程序文件\7-Zip\7z.exe"
设置VS2015 ="C:\程序文件(x86)\Microsoft Visual Studio 14.0\VC\二进制文件\vcvars32.bat"
设置VS2015_AMD64 ="C:\程序文件(x86)\Microsoft Visual Studio 14.0\VC\bin\amd64\vcvars64.bat"
所以很容易看出:您必须手动输入OpenSSL版本,其余的应该有合理的默认值...
注意:脚本使用SUBST T:\驱动器构建OpenSSL。
我测试了一下,效果很好,不到10分钟!为脚本的作者点赞!!
更新:要生成x64构建版本,您需要安装nasm汇编程序并将其放在PATH中。

r9f1avp5

r9f1avp54#

如果您想要使用MT预编译OpenSSL库,请查看此处:http://www.npcglib.org/~stathis/blog/precompiled-openssl/您将找到一个OpenSSL源代码的修补程序,该修补程序允许生成带有后缀MT/MD和“d”的库以进行调试,从而使识别库变得更加容易。
更重要的是,你也会发现实际的构建脚本,为许多不同版本的Visual Studio一次构建所有这些脚本。我自己构建和使用它们来准确地生成我的项目不需要DLL的二进制文件,你可能会发现它们很有用。

wecizke3

wecizke35#

OpenSSL现在似乎与-MT -Zl链接(至少在使用msvc时),这意味着它放弃了默认命名的库,这些库将在最终的二进制文件中决定。
换句话说,在二进制文件中使用它不需要采取任何操作,只需提供您想要的任何标志,OpenSSL库就会使用它。不幸的是,没有很多关于构建这样一个重要库的具体文档。

p1tboqfb

p1tboqfb6#

我通过手动编辑ntdll.mak文件解决了这个问题。您只需要更改两行:

  • CFLAG行中,将/MD更改为/MT
  • EX_LIBS行中,添加以下库:libcmt.lib libvcruntime.lib

保存makefile,然后按照OpenSSL说明运行nmake。您可以使用以下命令(VS命令行)检查Windows运行时依赖项是否已被删除:

dumpbin /dependents out32dll\libeay32.dll
dumpbin /dependents out32dll\ssleay32.dll

相关问题