SWIG OpenSSL 1.0-宏堆栈_出现问题

SWIG OpenSSL 1.0-宏堆栈_出现问题,openssl,swig,Openssl,Swig,使用以前的OpenSSL版本,可以在SWIG.i文件中执行此操作: STACK *ssl_get_ciphers(SSL *ssl) { return (STACK *)SSL_get_ciphers(ssl); } 对于OpenSSL 1.0.0beta3,这会失败,因为堆栈似乎不再定义。新的OpenSSL试图在类型检查方面做得更好,因此应该使用宏的堆栈_,其定义如下: #define STACK_OF(type) struct stack_st_##type Error: Syn

使用以前的OpenSSL版本,可以在SWIG.i文件中执行此操作:

STACK *ssl_get_ciphers(SSL *ssl) {
    return (STACK *)SSL_get_ciphers(ssl);
}
对于OpenSSL 1.0.0beta3,这会失败,因为堆栈似乎不再定义。新的OpenSSL试图在类型检查方面做得更好,因此应该使用宏的堆栈_,其定义如下:

#define STACK_OF(type) struct stack_st_##type
Error: Syntax error in input(1).
typedef t_stack_SSL_CIPHER STACK_OF(SSL_CIPHER)
如果我将上述代码更改为使用堆栈_:

STACK_OF(SSL_CIPHER) *ssl_get_ciphers(SSL *ssl) {
    return SSL_get_ciphers(ssl);
}
那么SWIG不喜欢这样:

#define STACK_OF(type) struct stack_st_##type
Error: Syntax error in input(1).
typedef t_stack_SSL_CIPHER STACK_OF(SSL_CIPHER)
我可以通过将其更改为:

struct stack_st_SSL_CIPHER *ssl_get_ciphers(SSL *ssl) {
    return SSL_get_ciphers(ssl);
}
但这显然是不好的,因为OpenSSL可能会在不同版本之间更改宏。有_stackstruct,但这也是OpenSSL私有细节,可能会随着版本的不同而变化。堆栈也可以作为参数输入,如:

int sk_x509_num(STACK_OF(X509) *stack) {
    return sk_num(stack);
}
哪个SWIG也不喜欢


有没有办法不用使用OpenSSL私有详细信息就可以实现这一点?

您可以创建自己的标题,使typedef如下所示:

#define STACK_OF(type) struct stack_st_##type
Error: Syntax error in input(1).
typedef t_stack_SSL_CIPHER STACK_OF(SSL_CIPHER)
然后在.i文件中

t_stack_SSL_CIPHER *ssl_get_ciphers(SSL *ssl) {
    return SSL_get_ciphers(ssl);
}

…并在编译时将标题包含在正确的位置?

经过进一步阅读,我发现了问题的原因以及解决方法。出现这个问题是因为SWIG的预处理器不知道宏的堆栈_,所以SWIG失败。我可以通过在.I文件中添加以下内容来解决此问题:

%include <openssl/safestack.h>
就在我上面提到的%包含行下面