我正在开发一个使用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?
6条答案
按热度按时间eulz3vhy1#
使用
nt.mak
生成文件,而不是ntdll.mak
生成文件。顺便说一句,我已经围绕标准OpenSSL构建脚本编写了一些脚本,这些脚本使在x86和x64混合的Windows上使用OpenSSL变得“更容易”(至少对我来说),您可以从here获得它们。
zxlwwiss2#
若要使用Visual Studio 2015生成64位OpenSSL静态链接(这会生成一个没有任何DLL的. exe文件),您将需要以下先决条件:
您需要在系统范围内安装所有这些工具,并将它们添加到
%PATH%
环境变量中。在你得到了我们需要的一切,只是按照这个简单的步骤:
1.从开始菜单打开 * VS2015 x64本机工具命令提示符 *。您将看到命令提示符。
C:\build
目录并在命令提示符下发出以下命令:cd c:\build
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\
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\
目录,并根据你的喜好编辑它。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中。
r9f1avp54#
如果您想要使用MT预编译OpenSSL库,请查看此处:http://www.npcglib.org/~stathis/blog/precompiled-openssl/您将找到一个OpenSSL源代码的修补程序,该修补程序允许生成带有后缀MT/MD和“d”的库以进行调试,从而使识别库变得更加容易。
更重要的是,你也会发现实际的构建脚本,为许多不同版本的Visual Studio一次构建所有这些脚本。我自己构建和使用它们来准确地生成我的项目不需要DLL的二进制文件,你可能会发现它们很有用。
wecizke35#
OpenSSL现在似乎与
-MT -Zl
链接(至少在使用msvc时),这意味着它放弃了默认命名的库,这些库将在最终的二进制文件中决定。换句话说,在二进制文件中使用它不需要采取任何操作,只需提供您想要的任何标志,OpenSSL库就会使用它。不幸的是,没有很多关于构建这样一个重要库的具体文档。
p1tboqfb6#
我通过手动编辑
ntdll.mak
文件解决了这个问题。您只需要更改两行:CFLAG
行中,将/MD
更改为/MT
EX_LIBS
行中,添加以下库:libcmt.lib libvcruntime.lib
保存makefile,然后按照OpenSSL说明运行nmake。您可以使用以下命令(VS命令行)检查Windows运行时依赖项是否已被删除: