3

私が書いていない ruby​​ gem にバインドされたかなり古い C 拡張機能を更新しています。現在、C 拡張機能を使用するスクリプトを実行すると、次のエラーが発生します。

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

同じライブラリにも問題がありましたがSTR2CSTR、StringValuePtr に置き換えることで修正されました。私の最初の考えは、rb_str2cstr を rb_string_value_ptr に置き換えることでしたが、それを試みると、C 拡張機能がビルドされません。私は決して C プログラマーではありません。これをどこに行けばよいかわかりません。rb_str2cstr をその代替品に置き換える必要があることはわかっていますが、それが何であるかを理解できないようです。

4

1 に答える 1

2

ruby.hfor Ruby 1.8.7-p357のソースには次のものがあります。

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

StringValue長さとポインタを取得するために on をVALUE使用できるa を返します。RSTRINGchar *

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 Stringであることが確実な場合は、StringValue呼び出しを省略できますが、そのままにしておく方が安全です。

于 2012-01-24T21:16:46.843 に答える