如何在Visual Studio中包含 OpenSSL

5

我正在尝试将openssl添加到我的项目中,但遇到了困难。我已经下载了Windows的预编译安装程序,并安装了库,但我找不到一种方法将openssl包含在我的项目中。

注意:我正在使用Windows 7 x64上的Visual Studio Expres 2012,但不限于该环境。

3个回答

22

简介



假设您已经在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子目录中):

    1. ${LIBCRYPTO}.dll

    2. ${LIBSSL}.dll


    其中LIBCRYPTO#1.)和LIBSSL#2.)定义如下:

    • v1.0.2及更早版本

      1. libeay32

      2. ssleay32(也可能被复制(或symlinked)到libssl32

    • v1.1.*

      1. libcrypto-1_*(-x64)

      2. libssl-1_*(-x64)

    • v3.*

      1. libcrypto-3*(-x64)

      2. libssl-3*(-x64)

顺便提一下,在Nix上,这两个文件(.dll - 共享对象)通常被命名为libcrypto.so.*和libssl.so.*(后缀是版本指示符)。

为了使用OpenSSL安装,在您的VStudio项目中,您必须进行以下配置(请查看[SO]: LNK2005 Error in CLR Windows Form (@CristiFati's answer)以获取更多关于原理(即为什么)的详细信息):

1. 配置编译器([MS.Learn]: Compiler Options Listed Alphabetically

指示它:

  • 在哪里搜索包含(头文件(.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>
    

    但前者更受推荐(建议)。

2. 配置链接器 ([MS.Learn]: 链接器选项)

指示它:

  • 在哪里搜索库。您可以通过转到"项目属性->链接器->常规->其他库目录"并添加${OPENSSL_INSTALL_DIR} \ lib (如果有多个路径,请用;分隔)。

  • 使用哪些库。"${OPENSSL_INSTALL_DIR}\lib" 目录包含一堆。lib文件。其中,您(最有可能)只需要${LIBCRYPTO}.lib和/或${LIBSSL}.lib。 转到您的“项目属性->链接器->输入->其他依赖项”并将这两个库添加到现有库旁边

3. 构建和运行

现在,如果您的所有设置和源代码都正确,您应该有一个“可构建”的项目。当您想要运行您的项目输出(无论是另一个可执行文件需要的.exe还是.dll),可执行文件将需要找到我在开头提到的2个.dll文件(如果您链接了_static版本(请检查#1),则不适用(不需要))。为此,您应该选择以下任一方法

  1. 将它们的dir添加到您的PATH env var中(我认为这是最干净的方法)。例如:

    • 从控制台(在启动可执行文件之前):

      set PATH=%PATH%;${OPENSSL_INSTALL_DIR}
      
    • 对于正在运行的VStudio实例:

      Img0

  2. 将它们复制到可执行文件所在的文件夹中([MS.Learn]: Dynamic-Link Library Search Order

  3. 将它们复制到您的%PATH%中的一个dir中。
    一些安装程序可能会将这两个.dll复制到您的“%SystemRoot%\System32dir中,在这种情况下,这将不再是必需的(我认为将东西复制到系统dir中是一种不好的做法),因为在我们当前的示例中,多个版本可以使用相同的文件名,并且最后安装的版本将覆盖所有其他版本)

重要提示:在针对您的项目进行目标定位时,必须小心处理 032位064位 (在 VStudio IDE 中将 平台 设置为 Win32x64) - 这必须与您的 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) 覆盖了它们。

1
非常好的答案。VS2019...但更重要的是,我不经常探索的这些小隐藏设置很不错,值得学习。 - LFMekz

7
自从这个问题最初被提出以来,很多事情发生了变化。自那时起,vcpkg问世并使得安装外部库变得更加容易。
要安装和使用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上进行测试。

参考文献:

vcpkg

vcpkg快速入门


1
使用Conan。安装和使用非常简单:

www.conan.io

您可以请求准备好的文件以供使用。例如,针对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,就像CentOS上的yum一样。vcpkg install openssl-windows - SSpoke
请按以下顺序运行2个命令: vcpkg integrate install vcpkg install openssl-windows 第一个命令会自动将软件包安装到您的VC2017/VC2019的正确位置。 - SSpoke

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接