Mise à jour de l'extension C pour Ruby 1.9
-
13-11-2019 - |
Question
Je met à jour une extension C assez ancienne liée à un joyau rubis que je n'ai pas écrit. Actuellement, lorsque j'exécute le script qui utilisera l'extension C, j'obtiens cette erreur:
symbol lookup error: /path/to/lib.so: undefined symbol: rb_str2cstr
Il y avait aussi des problèmes avec STR2CSTR
Dans la même bibliothèque, qui a été corrigée en la remplaçant par StringValuePtr. Ma pensée initiale était de remplacer RB_STR2CSTR par RB_STRING_VALUE_PTR, mais lorsque j'essaie, l'extension C ne se construire pas. Je ne suis en aucun cas un programmeur C, et je ne sais pas où aller avec cela. Je sais que je dois remplacer RB_STR2CSTR par son remplacement, mais je n'arrive pas à comprendre ce que c'est.
La solution
À la source de ruby.h
pour Ruby 1.8.7-P357 il a:
/* obsolete API - use StringValue() */
char *rb_str2cstr _((VALUE,long*));
StringValue
Renvoie un VALUE
que vous pouvez utiliser RSTRING
sur pour obtenir la longueur et char *
aiguille:
RSTRING(s)->len /* length */
RSTRING(s)->ptr /* char pointer */
Donc, si le code existant ressemblait à ceci:
VALUE str = ...; /* The ruby String */
long len;
char* words;
words = rb_str2cstr(str, &len);
Puis changez-le en:
VALUE str = ...;
str = StringValue(str);
char* words = RSTRING(str)->ptr;
long len = RSTRING(str)->len;
Si vous êtes sûr que str
est déjà une chaîne rubis, alors vous pouvez omettre le StringValue
Appelez, mais il serait plus sûr de le garder.