'HMAC_CTX'类型不完整

'HMAC_CTX' has incomplete type

本文关键字:HMAC CTX 类型      更新时间:2023-10-16

我正在尝试在 Fedora 31 上编译一个C++项目,但收到此错误:

[ 66%] Building CXX object proxy_ws/CMakeFiles/proxy_lws.dir/proxy_lws.cpp.o
In file included from /vagrant/include/libwebsockets.h:600,
from /vagrant/proxy_ws/proxy_lws_utils.hpp:12,
from /vagrant/proxy_ws/proxy_lws.cpp:18:
/vagrant/include/libwebsockets/lws-genhash.h:80:18: error: field ‘ctx’ has incomplete type ‘HMAC_CTX’ {aka ‘hmac_ctx_st’}
80 |         HMAC_CTX ctx;
|                  ^~~
In file included from /usr/include/openssl/crypto.h:25,
from /usr/include/openssl/comp.h:16,
from /usr/include/openssl/ssl.h:17,
from /vagrant/include/libwebsockets.h:250,
from /vagrant/proxy_ws/proxy_lws_utils.hpp:12,
from /vagrant/proxy_ws/proxy_lws.cpp:18:
/usr/include/openssl/ossl_typ.h:104:16: note: forward declaration of ‘HMAC_CTX’ {aka ‘struct hmac_ctx_st’}
104 | typedef struct hmac_ctx_st HMAC_CTX;
|                ^~~~~~~~~~~

关于如何解决它的任何想法?

我假设您使用的是最新版本的openSSL库。

看看这个: https://wiki.openssl.org/index.php/OpenSSL_1.1.0_Changes

第一行指出,openSSL 更新 API 的目标是使结构更加"不透明"。因此,您不能直接使用hmac_ctx_st。

在上面提供的链接中进一步向下滚动,您将看到以下内容:

应用程序代码现在必须使用指针,并且无法分配对象 直接在堆栈上。例如,如果旧代码确实如此:

BN_CTX ctx; 

您现在必须执行以下操作:

BN_CTX *ctx;
ctx = BN_CTX_new();
[...]
BN_CTX_free(ctx);

所以这是你问题的起点。您很可能需要将 ctx 声明为指针并在堆上分配内存。

但是请注意,您可能会遇到更多问题。鉴于更新库的整个前提是提高安全性,您现在必须通过"getters"和"setters"操作该结构中的数据。