首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SWIG OpenSSL 1.0 -SWIG宏的问题

SWIG OpenSSL 1.0 -SWIG宏的问题
EN

Stack Overflow用户
提问于 2009-07-30 18:14:27
回答 2查看 2.2K关注 0票数 2

在以前的OpenSSL版本中,可以在SWIG .i文件中做到这一点:

代码语言:javascript
复制
STACK *ssl_get_ciphers(SSL *ssl) {
    return (STACK *)SSL_get_ciphers(ssl);
}

对于OpenSSL 1.0.0beta3,这是失败的,因为堆栈似乎不再被定义。新的OpenSSL试图在类型检查方面做得更好,所以应该使用STACK_OF宏,它的定义如下:

代码语言:javascript
复制
#define STACK_OF(type) struct stack_st_##type

如果我将上面的代码更改为使用STACK_OF:

代码语言:javascript
复制
STACK_OF(SSL_CIPHER) *ssl_get_ciphers(SSL *ssl) {
    return SSL_get_ciphers(ssl);
}

那么SWIG不喜欢这样:

代码语言:javascript
复制
Error: Syntax error in input(1).

我可以通过将其更改为:

代码语言:javascript
复制
struct stack_st_SSL_CIPHER *ssl_get_ciphers(SSL *ssl) {
    return SSL_get_ciphers(ssl);
}

但这显然并不好,因为OpenSSL可能会在不同版本之间更改宏。有_STACK结构,但这仍然是OpenSSL的私有细节,可能会在不同的版本中发生变化。堆栈也可以作为参数出现,如下所示:

代码语言:javascript
复制
int sk_x509_num(STACK_OF(X509) *stack) {
    return sk_num(stack);
}

斯威格也不喜欢。

有没有办法在不使用OpenSSL私有细节的情况下做到这一点呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-08-01 06:54:41

经过进一步的阅读,我发现了为什么我会有这个问题,以及如何解决它。发生这个问题是因为SWIG的预处理器不知道STACK_OF宏,所以这就是SWIG失败的原因。我可以通过在我的.i文件中添加这个来解决这个问题:

代码语言:javascript
复制
%include <openssl/safestack.h>

现在我在使用LHASH_OF宏时也遇到了同样的问题。不幸的是,它包含在lhash.h中,lhash.h也包含stdio.h等,这是我不想要的(而且我的构建实际上无法按照设置的方式找到它们)。我的构建恰好需要-includeall命令行选项来切换。因此,不幸的是,对于LHASH_OF,我最终复制了OpenSSL中的定义:(

代码语言:javascript
复制
#define LHASH_OF(type) struct lhash_st_##type

就在我上面提到的%include行下面。

票数 1
EN

Stack Overflow用户

发布于 2009-07-31 05:57:05

你能创建你自己的头,让typedefs像这样:

代码语言:javascript
复制
typedef t_stack_SSL_CIPHER STACK_OF(SSL_CIPHER)

然后在.i文件中执行

代码语言:javascript
复制
t_stack_SSL_CIPHER *ssl_get_ciphers(SSL *ssl) {
    return SSL_get_ciphers(ssl);
}

...and在编译时把头文件放在正确的位置吗?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1208342

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档