簡體   English   中英

在 void 函數 C++ 中使用 #include 變量

[英]Using #include variables in void functions C++

在中斷了 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。 有什么建議? 鏈接配置參數中的錯誤參數?

任何建議都非常感謝! 謝謝麗塔。

在設置 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

有了所有這些,接下來就是您對標頭和包含的函數聲明的實際使用。 您在任何使用 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 調試器的啟動設置)中是最簡單的方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM