错误:在c++项目中使用HMAC_CTX时类型不完整

Error: incomplete type when using HMAC_CTX in C++ project

本文关键字:CTX 类型 HMAC c++ 项目 错误      更新时间:2023-10-16

我正在编译这个库ndn-cxx在我的笔记本电脑里。我已经在另一台计算机上尝试过了,它编译成功了,但现在我得到了这个错误,我认为它与openssl有关。我使用sudo apt-cache search libssl | grep SSL来验证我的笔记本电脑上有openssl,结果是:

  • libssl-ocaml - OCaml绑定的OpenSSL(运行时)
  • libssl-ocaml-dev - OCaml绑定
  • libssl0.9.8 - SSL共享库
  • libsslcommon2 -企业消息传递系统-通用SSL库
  • libsslcommon2-dev -企业消息传递系统-通用SSL开发文件

当我试图编译库时,我得到的错误是:

../src/security/transform/hmac-filter.cpp:49:12: error: field ‘m_context’ has incomplete type
   HMAC_CTX m_context;
            ^
../src/security/transform/hmac-filter.cpp: In constructor 
‘ndn::security::transform::HmacFilter::Impl::Impl()’:
../src/security/transform/hmac-filter.cpp:35:20: error: ‘m_context’ was not declared in this scope
     HMAC_CTX_init(&m_context);
                    ^
../src/security/transform/hmac-filter.cpp:35:29: error: ‘HMAC_CTX_init’ was not declared in this scope
     HMAC_CTX_init(&m_context);
                             ^
../src/security/transform/hmac-filter.cpp: In destructor ‘ndn::security::transform::HmacFilter::Impl::~Impl()’:
../src/security/transform/hmac-filter.cpp:40:23: error: ‘m_context’ was not declared in this scope
     HMAC_CTX_cleanup(&m_context);
                       ^    
../src/security/transform/hmac-filter.cpp:40:32: error: ‘HMAC_CTX_cleanup’ was not declared in this scope
     HMAC_CTX_cleanup(&m_context);
                                ^
../src/security/transform/hmac-filter.cpp: In member function ‘ndn::security::transform::HmacFilter::Impl::operator HMAC_CTX*()’:
../src/security/transform/hmac-filter.cpp:45:13: error: ‘m_context’ was not declared in this scope
     return &m_context;
             ^
../src/security/transform/hmac-filter.cpp:46:3: warning: control reaches end of non-void function [-Wreturn-type]
   }
   ^

导致编译错误的文件包含#if OPENSSL_VERSION_NUMBER < 0x1010000fL行,并且在这种情况下使用HMAC_CTX结构体。对于更新版本的OpenSSL(>1.1.0),它使用HMAX_CTX *。我的结论是,waf构建工具包含了错误的文件来获取OPENSSL_VERSION_NUMBER,因此编译时就好像您使用的是旧版本的OpenSSL,结构体HMAC_CTX,在新版本中不再可用。

您可以执行grep OPENSSL .waf-tools/openssl.py并分析打印的行,以查看不同的OpenSSL包含从哪里来。