聚合'BIGNUM foo'的类型不完整,无法定义

jwe*_*wel 8 c++ openssl makefile

我试图编译opendcp,但发生了错误.

$ make

...

[ 10%] Building CXX object libasdcp/CMakeFiles/opendcp-asdcp.dir/KM_prng.cpp.o
/home/jwel/opendcp/libasdcp/KM_prng.cpp: In function ‘void Kumu::Gen_FIPS_186_Value(const byte_t*, ui32_t, byte_t*, ui32_t)’:
/home/jwel/opendcp/libasdcp/KM_prng.cpp:219:10: error: aggregate ‘BIGNUM c_2powb’ has incomplete type and cannot be defined
   BIGNUM c_2powb, c_2, c_b;
          ^~~~~~~
/home/jwel/opendcp/libasdcp/KM_prng.cpp:219:19: error: aggregate ‘BIGNUM c_2’ has incomplete type and cannot be defined
   BIGNUM c_2powb, c_2, c_b;
                   ^~~
/home/jwel/opendcp/libasdcp/KM_prng.cpp:219:24: error: aggregate ‘BIGNUM c_b’ has incomplete type and cannot be defined
   BIGNUM c_2powb, c_2, c_b;
                        ^~~
/home/jwel/opendcp/libasdcp/KM_prng.cpp:220:19: error: ‘BN_init’ was not declared in this scope
   BN_init(&c_2powb);  BN_init(&c_2);  BN_init(&c_b);
                   ^
/home/jwel/opendcp/libasdcp/KM_prng.cpp:248:14: error: aggregate ‘BIGNUM bn_tmp’ has incomplete type and cannot be defined
       BIGNUM bn_tmp, bn_xkey, bn_x_n;
              ^~~~~~
/home/jwel/opendcp/libasdcp/KM_prng.cpp:248:22: error: aggregate ‘BIGNUM bn_xkey’ has incomplete type and cannot be defined
       BIGNUM bn_tmp, bn_xkey, bn_x_n;
                      ^~~~~~~
/home/jwel/opendcp/libasdcp/KM_prng.cpp:248:31: error: aggregate ‘BIGNUM bn_x_n’ has incomplete type and cannot be defined
       BIGNUM bn_tmp, bn_xkey, bn_x_n;
                               ^~~~~~
libasdcp/CMakeFiles/opendcp-asdcp.dir/build.make:110: recipe for target 'libasdcp/CMakeFiles/opendcp-asdcp.dir/KM_prng.cpp.o' failed
make[2]: *** [libasdcp/CMakeFiles/opendcp-asdcp.dir/KM_prng.cpp.o] Error 1
make[1]: *** [libasdcp/CMakeFiles/opendcp-asdcp.dir/all] Error 2
make: *** [all] Error 2
Run Code Online (Sandbox Code Playgroud)

对我来说它看起来像openssl问题,所以我试着测试一下:

$ cat testBIGNUM.cpp
#include <openssl/bn.h>
int main(){
    BIGNUM bn;
}

$ g++ testBIGNUM.cpp
testBIGNUM.cpp: In function ‘int main()’:
testBIGNUM.cpp:4:9: error: aggregate ‘BIGNUM bn’ has incomplete type and cannot be defined
  BIGNUM bn;
         ^~
Run Code Online (Sandbox Code Playgroud)

我的openssl版本是1.1.0d-2,我不知道如何解决它.

Mat*_*ell 8

OpenSSL 1.0.2和OpenSSL 1.1.0之间有很大的变化,它们并不是完全源兼容的.特别是1.0.2头文件中的许多数据结构现在都是不透明的.使用OpenSSL的应用程序需要进行一些小的更改才能兼容.

在BIGNUM的情况下,你需要这样做:

#include <openssl/bn.h>
int main() {
    BIGNUM *bn;

    bn = BN_new();

    ...
    BN_free(bn);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

在opendcp的情况下,答案可能只是降级到OpenSSL 1.0.2.