Обновление расширения C для Ruby 1.9 - PullRequest
3 голосов
/ 25 января 2012

Я обновляю довольно старое расширение 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 его заменой, но я не могу понять, что это такое.

1 Ответ

2 голосов
/ 25 января 2012

В источнике ruby.h для Ruby 1.8.7-p357 он имеет:

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

StringValue возвращает 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, но было бы безопаснее его сохранить.

...