Ошибка компиляции rfuzz в ruby ​​1.9.2 - PullRequest
2 голосов
/ 08 марта 2011

Я пытаюсь скомпилировать расширение c для rfuzz.Я получаю ошибку:

make gcc -I. -I/usr/local/include/ruby-1.9.1/i686-linux -I/usr/local/include/ruby-1.9.1/ruby/backward -I/usr/local/include/ruby-1.9.1 -I. -D_FILE_OFFSET_BITS=64  -fPIC -O3 -ggdb -Wextra -Wno-unused-parameter -Wno-parentheses -Wpointer-arith -Wwrite-strings -Wno-missing-field-initializers -Wno-long-long  -o http11_client.o -c http11_client.c
http11_client.c: In function ‘client_http_field’:
http11_client.c:36:22: error: ‘struct RString’ has no member named ‘ptr’
http11_client.c:36:50: error: ‘struct RString’ has no member named ‘len’
http11_client.c: In function ‘HttpClientParser_execute’:
http11_client.c:218:23: error: ‘struct RString’ has no member named ‘ptr’
http11_client.c:219:23: error: ‘struct RString’ has no member named ‘len’
make: *** [http11_client.o] Error 1

RString находится в Ruby.h.Структура в ruby.h действительно имеет этих членов.

struct RString {
    struct RBasic basic;
    union {
        struct {
            long len;
            char *ptr;
            union {
                long capa;  
                VALUE shared;
            } aux;
        } heap;
        char ary[RSTRING_EMBED_LEN_MAX + 1];
    } as;
};

Что мне не хватает?

Ответы [ 2 ]

2 голосов
/ 09 марта 2011

Похоже, RFuzz не совместим с Ruby 1.9.2. Определение RString для 1.9.2 такое же, как вы перечислили, но для 1.8.7 это выглядит так:

struct RString {
    struct RBasic basic;
    long len;
    char *ptr;
    union {
        long capa;
        VALUE shared;
    } aux;
};

, что соответствует тому, что ищет источник RFuzz. Таким образом, вы можете перейти на 1.8 для использования RFuzz или портировать RFuzz для работы с более новыми версиями Ruby.

Сайт RFuzz, по-видимому, не обновлялся с 2006 года, поэтому он может больше не поддерживаться.

0 голосов
/ 09 марта 2011

Я не знаю исходный код ruby; просто посмотрев на то, что вы опубликовали:

Тип struct RString имеет 2 члена: basic (типа struct RBasic) и as (типа без тегов).

Объединение без тегов, обозначенное as, имеет 2 члена: heap типа структуры без тега и ary массива типа char.

Структура без тегов, обозначенная heap, имеет член ptr.

Итак, чтобы достичь этого, вам нужно

struct RString x;
x.as.heap.ptr; /* this is a char* */
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...