문제

나는 내가 작성하지 않은 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을 대체품으로 교체해야 한다는 것을 알고 있지만 그게 무엇인지 알 수 없는 것 같습니다.

도움이 되었습니까?

해결책

소스에서 ruby.h 루비 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 전화하세요. 하지만 보관하는 것이 더 안전할 거예요.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top