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

2022-01-07 00:00:00 ssl openssl c++

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

I am trying to compile this library ndn-cxx in my laptop. I already tried in another computer and it compiled successfully but now i am getting this error and i think its related somhow to openssl. I verify that i have openssl in my laptop using sudo apt-cache search libssl | grep SSL and the result is :

  • libssl-ocaml - OpenSSL 的 OCaml 绑定(运行时)
  • libssl-ocaml-dev - OpenSSL 的 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,在较新的版本中不再可用.

The file that causes the compilation error contains the line #if OPENSSL_VERSION_NUMBER < 0x1010000fL and uses the struct HMAC_CTX in that case. For newer versions of OpenSSL (>1.1.0), it uses HMAX_CTX *. My conclusion is that the waf build tool includes the wrong file to get the OPENSSL_VERSION_NUMBER and consequently compiles as if you are using an older version of OpenSSL, with the struct HMAC_CTX, which is no longer available as such in the newer versions.

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

You could do grep OPENSSL .waf-tools/openssl.py and analyse the printed lines to see where the different OpenSSL includes come from.

相关文章