我正在使用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 Walker中打开libeay32.dll
,我发现找不到MSVCR90.dll
。所以applink.c
的诀窍并不适合我。
如何使用/MT
或/MTd
选项构建OpenSSL?
答案 0 :(得分:6)
使用nt.mak
makefile而不是ntdll.mak
makefile。
顺便说一句,我已经围绕标准的OpenSSL构建脚本编写了一些脚本,这使得“(至少对我来说)在Windows上使用OpenSSL同时使用x86和x64”更容易“,你可以从{ {3}}
答案 1 :(得分:3)
我找到的最优雅的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 tarball,就像这样 之一。
该脚本假设您已经安装了Python(2.7或3.x) PATH
该脚本假设您已安装7-zip(无需启用 您的路径)选择您要使用的脚本并进行编辑。例如, 让我们来看看rebuild_openssl_vs2015.cmd的顶部:
T:
设置OPENSSL_VERSION = 1.0.1p
设置SEVENZIP =" C:\ Program Files \ 7-Zip \ 7z.exe"
设置VS2015 =" C:\ Program Files(x86)\ Microsoft Visual Studio 14.0 \ VC \ BIN \ VCVARS32.BAT"
设置VS2015_AMD64 =" C:\ Program Files(x86)\ Microsoft Visual Studio 14.0 \ VC \ BIN \ AMD64 \ vcvars64.bat"
因此很容易看出:您必须输入OpenSSL版本 手动,其余应该有合理的默认值......
注意:该脚本使用SUBST T:\驱动器来构建OpenSSL。
我在不到10分钟的时间内进行了测试并且有效! KUDOS为剧本的作者!!
更新:要生成x64版本,您需要安装nasm汇编程序并将其放在PATH中。
答案 2 :(得分:1)
如果您想要使用MT预编译的OpenSSL库,请查看:http://www.npcglib.org/~stathis/blog/precompiled-openssl/ 您将找到OpenSSL源代码的补丁,它可以生成带有后缀MT / MD的库和用于调试的“d”,以便更容易识别库。
此外,您还将找到实际的构建脚本,以便为许多不同版本的Visual Studio一次构建所有这些脚本。我自己构建和使用它们来完全生成不需要我的项目的DLL的二进制文件,你可能会觉得它们很有用。
答案 3 :(得分:1)
要使用Visual Studio 2015构建静态链接的64位OpenSSL(导致没有任何DLL的单个.exe文件),您将需要以下先决条件:
您需要在系统范围内安装所有这些工具,并将它们添加到%PATH%
环境变量中。
获得我们需要的一切后,只需按照以下简单步骤操作:
创建C:\build
目录并在命令提示符中发出以下命令:
cd c:\build
下载最新的zlib&使用以下命令将OpenSSL源代码发送到build
目录:
git clone https://github.com/madler/zlib
git clone https://github.com/openssl/openssl
首先,我们必须构建静态zlib
。首先,我们需要编辑一些配置文件:
zlib
源文件夹:cd C:\build\zlib
编辑win32\Makefile.msc
文件:
CFLAGS
-MD
替换为-GL -MT -Zc:wchar_t-
LDFLAGS
-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\
xcopy zconf.h C:\build\openssl\
xcopy zlib.lib C:\build\openssl\
xcopy zlib.pdb C:\build\openssl\
导航至OpenSSL
来源:cd C:\build\openssl\
并将其配置为使用静态zlib&从openssl.cnf
目录中读取配置文件(C:\Windows\
)。
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
通过发出OpenSSL
命令构建nmake
(大约需要15分钟)。
生成的~3MB openssl.exe
文件将位于C:\build\openssl\apps\
目录。它是完全可移植的,因为包含了所有DLL。如果您需要使用自定义配置文件,请将C:\build\openssl\apps\openssl.cnf
复制到您的C:\Windows\
目录&根据自己的喜好编辑它。
答案 4 :(得分:0)
似乎OpenSSL现在与-MT -Zl
链接(至少在使用msvc时),这意味着它将丢弃默认的命名库,这些库随后在最终的二进制文件中确定。默认情况下,应用程序似乎使用静态运行时。
换句话说,无需采取任何措施即可将其与二进制文件一起使用,只需提供所需的任何标志,OpenSSL库即可使用它。不幸的是,关于建立如此重要的库,没有很多具体的文档。