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.

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top