我正在尝试编译rfuzz的c扩展名。我得到的错误是
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;
};
我错过了什么?
答案 0 :(得分:2)
看起来RFuzz与Ruby 1.9.2不兼容。 1.9.2的RString
定义如您所列,但对于1.8.7,它看起来像这样:
struct RString {
struct RBasic basic;
long len;
char *ptr;
union {
long capa;
VALUE shared;
} aux;
};
匹配RFuzz源似乎正在寻找的东西。因此,您可以使用RFuzz下拉至1.8,或者您可以尝试移植RFuzz以使用更新版本的Ruby。
自2006年以来,RFuzz网站似乎没有更新过,因此可能根本不再进行维护。
答案 1 :(得分:0)
我不知道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* */