使用以前的OpenSSL版本,可以在SWIG .i文件中执行此操作:
STACK *ssl_get_ciphers(SSL *ssl) {
return (STACK *)SSL_get_ciphers(ssl);
}
使用OpenSSL 1.0.0beta3会失败,因为似乎不再定义STACK。新的OpenSSL尝试在类型检查方面做得更好,因此应该使用STACK_OF宏,其定义如下:
#define STACK_OF(type) struct stack_st_##type
如果我更改上面的代码以使用STACK_OF:
STACK_OF(SSL_CIPHER) *ssl_get_ciphers(SSL *ssl) {
return SSL_get_ciphers(ssl);
}
然后SWIG不喜欢这个:
Error: Syntax error in input(1).
我可以通过将其更改为:
来编译struct stack_st_SSL_CIPHER *ssl_get_ciphers(SSL *ssl) {
return SSL_get_ciphers(ssl);
}
但这显然不太好,因为OpenSSL可以将宏从发布更改为发布。有_STACK结构,但同样是OpenSSL私有细节,可能会在发行版之间发生变化。堆栈也可以作为参数输入,如:
int sk_x509_num(STACK_OF(X509) *stack) {
return sk_num(stack);
}
SWIG也不喜欢。
有没有办法在不使用OpenSSL私有细节的情况下完成这项工作?
答案 0 :(得分:1)
经过一番阅读后,我发现了为什么会遇到这个问题,以及如何解决这个问题。问题发生的原因是SWIG的预处理器不知道STACK_OF宏,所以这就是SWIG失败的原因。我可以通过在我的.i文件中添加它来解决这个问题:
%include <openssl/safestack.h>
现在我也遇到了与LHASH_OF宏相同的问题。不幸的是它包含在lhash.h中,它还包括stdio.h等我不想要的(我的构建实际上找不到它的设置方式)。我的构建恰好需要-includeall命令行选项来swig。不幸的是,LHASH_OF最终我从OpenSSL复制了这个定义:(
#define LHASH_OF(type) struct lhash_st_##type
在我提到的%include行下面。
答案 1 :(得分:0)
你能创建自己的标题,使得typedef像这样:
typedef t_stack_SSL_CIPHER STACK_OF(SSL_CIPHER)
然后在.i文件中执行
t_stack_SSL_CIPHER *ssl_get_ciphers(SSL *ssl) {
return SSL_get_ciphers(ssl);
}
...并在编译时将标题#included放在正确的位置?