我正在尝试将openssl添加到我的项目中,但遇到了困难。我已经下载了Windows的预编译安装程序,并安装了库,但我找不到一种方法将openssl包含在我的项目中。
注意:我正在使用Windows 7 x64上的Visual Studio Expres 2012,但不限于该环境。
我正在尝试将openssl添加到我的项目中,但遇到了困难。我已经下载了Windows的预编译安装程序,并安装了库,但我找不到一种方法将openssl包含在我的项目中。
注意:我正在使用Windows 7 x64上的Visual Studio Expres 2012,但不限于该环境。
虽然这个问题/答案是基于:
OpenSSL 1.0.1*
VStudio 2012
但它适用于任何 OpenSSL 版本 (v.0.9.*, v1.*, v3.*, ...),以及任何 VStudio 版本 (v2005+)
OpenSSL 构建也可在 [GitHub]: CristiFati/Prebuilt-Binaries - (master) Prebuilt-Binaries/OpenSSL获取(有关详细信息,请查看[SO]: 如何在 Windows 10 中安装 OpenSSL? (@CristiFati's answer))
假设您已经在dir中安装了OpenSSL,例如:"C:\Program Files\Openssl-Win32-1.0.1p....."(或其他任何名称); 我将把它称为OPENSSL_INSTALL_DIR(因为它是一个Nix风格的envvar)。 因此,${OPENSSL_INSTALL_DIR}应该包含一堆dir和文件,其中对我们很重要的是:
目录s:
include
lib
文件(由于它们的名称在不同版本中有所变化,因此我将使用(再次,Nix风格的var)占位符来引用它们;另外它们可能位于一个bin子目录中):
${LIBCRYPTO}.dll
${LIBSSL}.dll
其中LIBCRYPTO(#1.)和LIBSSL(#2.)定义如下:
v1.0.2及更早版本
libeay32
ssleay32(也可能被复制(或symlinked)到libssl32)
v1.1.*
libcrypto-1_*(-x64)
libssl-1_*(-x64)
v3.*
libcrypto-3*(-x64)
libssl-3*(-x64)
顺便提一下,在Nix上,这两个文件(.dll - 共享对象)通常被命名为libcrypto.so.*和libssl.so.*(后缀是版本指示符)。
为了使用OpenSSL安装,在您的VStudio项目中,您必须进行以下配置(请查看[SO]: LNK2005 Error in CLR Windows Form (@CristiFati's answer)以获取更多关于原理(即为什么)的详细信息):
指示它:
在哪里搜索包含(头文件(.h))文件。进入您的“项目属性 -> C/C++ -> 通用 -> 附加包含目录”,并添加${OPENSSL_INSTALL_DIR}\include(如果您需要添加其他路径,请使用分号(;)将它们分开)。现在,您可以在源代码中包含OpenSSL头文件。
请注意,因为“${OPENSSL_INSTALL_DIR}\include”目录包含一个openssl子目录,在该子目录下是实际的头文件,因此您的#include语句应该像这样:
#include <openssl/ssl.h>
当然,您可以将${OPENSSL_INSTALL_DIR}\include\openssl 目录添加到您的项目中,然后上面的包含语句将是:
#include <ssl.h>
但前者更受推荐(建议)。
指示它:
在哪里搜索库。您可以通过转到"项目属性->链接器->常规->其他库目录"并添加${OPENSSL_INSTALL_DIR} \ lib (如果有多个路径,请用;分隔)。
使用哪些库。"${OPENSSL_INSTALL_DIR}\lib" 目录包含一堆。lib文件。其中,您(最有可能)只需要${LIBCRYPTO}.lib和/或${LIBSSL}.lib。 转到您的“项目属性->链接器->输入->其他依赖项”并将这两个库添加到现有库旁边
对于这两个库中的每一个,都有两个变体:
“正常”的那一个
以“_static”结尾的另一个(1)
请查看[SO]:MS Visual C上连接到protobuf 3时出错(@CristiFati's answer)(开头部分)以获得每个说明的简要介绍
现在,如果您的所有设置和源代码都正确,您应该有一个“可构建”的项目。当您想要运行您的项目输出(无论是另一个可执行文件需要的.exe还是.dll),可执行文件将需要找到我在开头提到的2个.dll文件(如果您链接了_static版本(请检查#1),则不适用(不需要))。为此,您应该选择以下任一方法:
将它们的dir添加到您的PATH env var中(我认为这是最干净的方法)。例如:
将它们复制到可执行文件所在的文件夹中([MS.Learn]: Dynamic-Link Library Search Order)
将它们复制到您的%PATH%中的一个dir中。
一些安装程序可能会将这两个.dll复制到您的“%SystemRoot%\System32”dir中,在这种情况下,这将不再是必需的(我认为将东西复制到系统dir中是一种不好的做法),因为在我们当前的示例中,多个版本可以使用相同的文件名,并且最后安装的版本将覆盖所有其他版本)
重要提示:在针对您的项目进行目标定位时,必须小心处理 032位 或 064位 (在 VStudio IDE 中将 平台 设置为 Win32 或 x64) - 这必须与您的 OpenSSL 安装架构相匹配(检查[SO]: Python Ctypes - loading dll throws OSError: [WinError 193] %1 is not a valid Win32 application (@CristiFati's answer)以获取错误信息)。
值得一提的是,.dll 搜索机制也适用于动态加载 .dll(通过 [MS.Learn]: LoadLibraryExW function (libloaderapi.h) 函数族),如上面的 URL 中所解释的那样。还有其他方法(但这些方法包括硬编码路径:[MS.Learn]: AddDllDirectory function (libloaderapi.h))。尽管在更复杂的情况下,[SO]: Can't import dll module in Python (@CristiFati's answer) 覆盖了它们。vcpkg
问世并使得安装外部库变得更加容易。git clone https://github.com/Microsoft/vcpkg
cd vcpkg
bootstrap-vcpkg.bat
vcpkg integrate install
最后一条命令是可选的,但建议进行用户范围的集成。
然后尝试安装OpenSsl,请执行以下操作:
vcpkg search ssl
vcpkg install openssl-windows --triplet x64-windows
你的选项可能因平台具体情况而异。
重新启动Visual Studio,你应该可以开始了。
已在Visual Studio Community 2019上进行测试。
参考文献:
您可以请求准备好的文件以供使用。例如,针对Linux x64或与Visual Studio 2012一起使用...这里是一个示例指令:
conan install OpenSSL/1.0.2g@lasote/stable -s arch="x86_64" -s build_type="Debug" -s compiler="gcc" -s compiler.version="5.3" -s os="Linux" -o 386="False" -o no_asm="False" -o no_rsa="False" -o no_cast="False" -o no_hmac="False" -o no_sse2="False" -o no_zlib="False" ...
vcpkg install openssl-windows
。 - SSpokevcpkg integrate install
vcpkg install openssl-windows
第一个命令会自动将软件包安装到您的VC2017/VC2019的正确位置。 - SSpoke