在以前的OpenSSL版本中,可以在SWIG .i文件中做到这一点:
STACK *ssl_get_ciphers(SSL *ssl) {
return (STACK *)SSL_get_ciphers(ssl);
}对于OpenSSL 1.0.0beta3,这是失败的,因为堆栈似乎不再被定义。新的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);
}斯威格也不喜欢。
有没有办法在不使用OpenSSL私有细节的情况下做到这一点呢?
发布于 2009-08-01 06:54:41
经过进一步的阅读,我发现了为什么我会有这个问题,以及如何解决它。发生这个问题是因为SWIG的预处理器不知道STACK_OF宏,所以这就是SWIG失败的原因。我可以通过在我的.i文件中添加这个来解决这个问题:
%include <openssl/safestack.h>现在我在使用LHASH_OF宏时也遇到了同样的问题。不幸的是,它包含在lhash.h中,lhash.h也包含stdio.h等,这是我不想要的(而且我的构建实际上无法按照设置的方式找到它们)。我的构建恰好需要-includeall命令行选项来切换。因此,不幸的是,对于LHASH_OF,我最终复制了OpenSSL中的定义:(
#define LHASH_OF(type) struct lhash_st_##type就在我上面提到的%include行下面。
发布于 2009-07-31 05:57:05
你能创建你自己的头,让typedefs像这样:
typedef t_stack_SSL_CIPHER STACK_OF(SSL_CIPHER)然后在.i文件中执行
t_stack_SSL_CIPHER *ssl_get_ciphers(SSL *ssl) {
return SSL_get_ciphers(ssl);
}...and在编译时把头文件放在正确的位置吗?
https://stackoverflow.com/questions/1208342
复制相似问题