【问题标题】:Using #include variables in void functions C++在 void 函数 C++ 中使用#include 变量
【发布时间】:2018-10-21 20:17:20
【问题描述】:

我在中断 15 年后回到 C++,一直在努力记住如何使 #include 中的变量/函数可用于 void 函数。目前,我使用的是单个 .cpp,但会将函数导出到单独的 .cpp 以根据需要调用。

我有以下:

// C++
#include <stdio.h>
#include <iostream>
#include <math.h>
#include <errno.h>
#include <cstring>

// OpenSSL
#include <evp.h>
#include <aes.h>
#include <rand.h>
#include <err.h>
#include <buffer.h>

using namespace std;

typedef struct _cipher_params_t {
    unsigned char *key;
    unsigned char *iv;
    unsigned int encrypt;
    const EVP_CIPHER *cipher_type;
}cipher_params_t;

EVP_CIPHER 在 evp.h 文件中,但似乎无法找到它。我的包含路径似乎正在工作,因为当我键入 #include 时我可以看到/选择模块,它会在其他包含 (aes.h) 中找到其他变量。

此外,在下面的函数中,不能识别来自 evp.h 的项目,例如 EVP_CIPHER_CTX *ctx,即使它已声明,而其他项目是从其他包含(如 err.h)解析的。

 void file_encrypt_decrypt(cipher_params_t *params, FILE *ifp, FILE *ofp) {
 /* Allow enough space in output buffer for additional block */
 int cipher_block_size = EVP_CIPHER_block_size(params->cipher_type);
 unsigned char in_buf[BUFSIZE], out_buf[in_buf + cipher_block_size];

 int num_bytes_read, out_len;
 EVP_CIPHER_CTX *ctx;
 :
 :

我正在使用带有 openSSL 的 Visual Studio 2017 Enterprise。有什么建议么?链接配置参数中的参数错误?

非常感谢任何建议! 谢谢 丽塔。

【问题讨论】:

  • stackoverflow 上通常的经验法则是,如果您遇到错误(编译或运行时),请将完整的错误消息复制并粘贴到您的问题中。
  • EVP_CIPHER 和 EVP_CIPHER_CTX 实际上是在ossi_typ.h 中定义的,并且该文件包含在evp.h 中。不知道为什么这对你不起作用。您可以尝试将#include &lt;openssl/ossl_typ.h&gt; 行放在您的代码中,位于 OpenSSL 包含的顶部。不过,不确定这是否会有所帮助。希望你能得到答案。
  • C++ 中不需要typedef struct。看起来你可能会更乐意用 C 写这个。
  • 任何库存的 OpenSSL sdk 版本都有一个名为 include 的文件夹。该文件夹应添加到项目的包含路径中(因此您的源文件会编译)。在该文件夹中是文件夹链openssl/*。我知道这看起来很混乱,但它可以确保你得到你想要的标题。所有的 openssl 标头都应该是 #include &lt;openssl/headernamehere.h&gt; 它很重要,因为在这些标头中包含 other 标头,其中一些也在 openssl 包含文件夹中并使用 same 命名法.
  • 谢谢大家!我快到了。只是想找到 cleanup() 的位置,然后我就可以开始了。我在我的工作计算机(不同版本的 openSSL)上工作,但在我的家用计算机上苦苦挣扎。 @NeilButterworth,我最好用 C 编写,但我被指示使用 C++ 和 EVP/AES。

标签: c++ function encryption openssl


【解决方案1】:

在设置 Visual Studio 项目以使用 OpenSSL SDK 构建时,您应该执行以下操作(如果 Visual Studio 设置的名称不太准确,请原谅我;我没有运行 dev-studio在我面前,所以我都是凭记忆做这一切的):

  1. 找到您将使用的 OpenSSL 版本。对于此列表的其余部分,该文件夹将称为 OpenSSLDir。
  2. 确保 OpenSSLDir 中的 SDK 与您的 Visual Studio 构建体系结构相匹配。如果您使用的是 x86 OpenSSL sdk 构建,您的项目也需要是 x86。对于 x64 也是如此。
  3. OpenSSLDir 中有一系列子文件夹:bin、lib、include 等。请注意 include 和 lib 文件夹,我们需要它们。
  4. 在 Visual Studio 项目中,在 C++ 配置设置(调试和发布构建配置)下是“附加包含目录”设置。应在此处添加 OpenSSLDir/include 文件夹的完整(或相对)路径
  5. 在同一个项目中,在链接设置下是“附加库目录”,应在此处添加 OpenSSLDir/lib 文件夹。
  6. 在同一个项目中,在链接设置下是“附加库输入”(这可能是我最糟糕的名称/位置,但您应该能够找到它)。在这里,您将 libeay32.lib 添加到您的库文件集(应该已经包括 kernel32.lib、user32.lib 等...通过继承)。如果您还使用 SSL_xxx api,则还需要在该列表中添加 ssleay32.lib

所有这些都准备好之后,您就可以实际使用标头和包含的函数 decls。在您使用 OpenSSL API 的任何地方,都应该通过相关标头引入该 API。因为 OpenSSLDir/include 在包含路径中,所以您已经完成了一半。 所有 OpenSSL 标头都应包含以下格式

#include <openssl/evp.h>
#include <openssl/sha.h>
#include <openssl/aes.h>
... etc ...

OpenSSL 标头经常(阅读:保证会发生)在 SDK 中包含 other 标头,它们与 完全相同 相同的命名法包含。因此,至关重要的是您将其设置为以相同的方式为您(以及他们)工作。按照我提供的说明,它应该可以工作。

当涉及到实际运行您的程序时,我将确保您的构建平台的libeay32.dllssleay32.dll 位于正确的路径或当前工作目录中的任务留给您。确保 OpenSSLDir/bin 文件夹位于我们的路径中(或 Visual Studio 调试器的启动设置)是最简单的方法。

【讨论】:

  • 非常感谢@WhozCraig!使用最新版本的 SDK 似乎在 VC2017 中实现有点不同。不过我快到了。一旦我将 openssl 的限定符添加到包含它似乎找到了大部分项目。我还在寻找 cleanup()。
猜你喜欢
  • 1970-01-01
  • 2014-12-20
  • 1970-01-01
  • 1970-01-01
  • 2014-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多