在 void 函数中使用 #include 变量C++

Using #include variables in void functions C++

本文关键字:#include 变量 C++ void 函数      更新时间:2023-10-16

在中断 15 年后,我又回到了C++,并且一直在努力记住如何使 #include 中的变量/函数可用于无效函数。 目前,我使用的是单个.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。有什么建议吗? 链路配置参数中的参数陈述错误?

任何建议将不胜感激! 谢谢 对手

将Visual Studio项目设置为使用OpenSSL SDK构建时,您应该执行以下操作(如果Visual Studio设置的名称不太正确,请原谅我;我没有在我面前运行开发工作室,所以我是根据记忆完成所有这些工作的(:

  1. 找到您将使用的 OpenSSL 构建版本。对于此列表的其余部分,该文件夹将称为OpenSSLDir。
  2. 确保 OpenSSLDir 中的 SDK 与您的 Visual Studio 构建架构匹配。如果您使用的是x86 OpenSSL sdk构建,则项目也需要是x86。x64 也是如此。
  3. OpenSSLDir中有一系列子文件夹:bin,lib,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 中的其他标头,这些标头包含完全相同的命名法。因此,将其设置为以相同的方式为您(以及他们(工作至关重要。按照我提供的说明,它应该可以工作。

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