我正在使用OpenSSL 1.0.1e库的Windows的C ++应用程序。 我在Visual Studio 2008上。
出于便携性原因,我的应用程序与运行时库( /MT
和/MTd
选项)静态链接。 而且我没有运行我的应用程序运行库。
根据OpenSSL FAQ ,该库默认与multithreadingDLL运行时( /MDd
)链接,这显然与我的scheme不兼容。 所以为了使我的程序工作,我已经添加了applink.c
到我的项目。 在我的开发机器和大多数testing计算机上,程序工作正常。
但不幸的是,我find了应用程序无法启动的计算机。 Windows显示错误:
The application failed to initialize properly (0xc0150002). Click on OK to terminate the application.
我在Dependency Walker中打开了libeay32.dll
,发现MSVCR90.dll
没有find。 所以applink.c
的窍门并不适合我。
如何使用/MT
或/MTd
选项构buildOpenSSL?
使用nt.mak
生成文件而不是ntdll.mak
生成文件。
另外,我已经编写了一些围绕标准OpenSSL构建脚本的脚本,这些脚本使得在Windows上同时使用x86和x64的OpenSSL更容易(至少对我来说),您可以从这里获得它们。
我在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(不需要在您的PATH上)选择您要使用的脚本并进行编辑。 例如,让我们看一下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中。
如果你想要使用MT预编译的OpenSSL库,请看这里: http : //www.npcglib.org/~stathis/blog/precompiled-openssl/你将会找到一个OpenSSL源代码补丁,它能够生成带有后缀MT / MD的库和“ d“进行调试,以便更容易地识别库。
更重要的是,您还可以找到实际的构建脚本,为许多不同版本的Visual Studio一次构建所有这些脚本。 我自己构建和使用它们来准确地生成不需要任何DLL的二进制文件,您可能会发现它们很有用。
要使用Visual Studio 2015构建64位OpenSSL静态链接(导致一个.exe文件没有任何DLL),您将需要以下先决条件:
您需要在系统范围内安装所有这些工具,并将它们添加到您的%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
开头的行 -opt:icf -dynamicbase -nxcompat -ltcg /nodefaultlib:msvcrt
替换-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并从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
开头的行 /incremental:no /opt:icf /dynamicbase /nxcompat /ltcg /nodefaultlib:msvcrt
替换/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\
目录并根据自己的喜好进行编辑。