3

我正在更新一个相当旧的 C 扩展,该扩展绑定到我没有编写的 ruby​​ gem。目前,当我执行将使用 C 扩展的脚本时,我收到此错误:

symbol lookup error: /path/to/lib.so: undefined symbol: rb_str2cstr

在同一个库中也存在问题STR2CSTR,已通过将其替换为 StringValuePtr 来解决。我最初的想法是用 rb_string_value_ptr 替换 rb_str2cstr,但是当我尝试这样做时,C 扩展将无法构建。我绝不是 C 程序员,也不知道该去哪里。我知道我必须用它的替代品替换 rb_str2cstr,但我似乎无法弄清楚那是什么。

4

1 回答 1

2

ruby.hRuby 1.8.7-p357的源代码中,它具有:

/* obsolete API - use StringValue() */
char *rb_str2cstr _((VALUE,long*));

StringValue返回 a VALUE,您可以使用RSTRING它来获取长度和char *指针:

RSTRING(s)->len /* length */
RSTRING(s)->ptr  /* char pointer */

因此,如果现有代码看起来像这样:

VALUE str = ...; /* The ruby String */

long  len;
char* words;
words = rb_str2cstr(str, &len);

然后将其更改为:

VALUE str = ...;
str = StringValue(str);

char* words = RSTRING(str)->ptr;
long  len   = RSTRING(str)->len;

如果您确定这str已经是一个 Ruby 字符串,那么您可以省略该StringValue调用,但保留它会更安全。

于 2012-01-24T21:16:46.843 回答