如何编译/创建一个使用c的ruby扩展? [英] How do I compile/create a ruby extension that uses c?

查看:162
本文介绍了如何编译/创建一个使用c的ruby扩展?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想创建一个使用c的ruby扩展。但是当我使用gcc进行编译时,出现这个错误:

$ g $ ruby​​xt.c -orubyext -I / usr / local /include/ruby-1.9.1/

从rubyext.c包含的文件中:1:
/usr/local/include/ruby-1.9.1/ruby/ruby.h: 25:25:error:ruby / config.h:没有这样的文件或目录
从rubyext.c包含的文件中:1:
/usr/local/include/ruby-1.9.1/ruby/ ruby.h:107:错误:'SIZEOF_INT'在此处未声明(不在函数中)
/usr/local/include/ruby-1.9.1/ruby/ruby.h:108:错误:'SIZEOF_LONG'未声明这里(不是在函数中)
/usr/local/include/ruby-1.9.1/ruby/ruby.h:112:错误:'SIZEOF_VOIDP'这里未声明(不在函数中)
In文件包括从/usr/local/include/ruby-1.9.1/ruby/ruby.h:1326,
从rubyext.c:1:
/usr/local/include/ruby-1.9。 1 / ruby​​ / missing.h:25:错误:重新定义'struct timeval'
/usr/local/include/ruby-1.9.1/ruby/missing.h:35:错误:重新定义'struct timepec '
在文件包括编辑自/usr/local/include/ruby-1.9.1/ruby/intern.h:27,
来自/usr/local/include/ruby-1.9.1/ruby/ruby.h:1327,
from ruby​​ext.c:1:
/usr/lib/gcc/x86_64-linux-gnu/4.4.3/include/varargs.h:4:2:error:#errorGCC不再实现< varargs.h中取代。
/usr/lib/gcc/x86_64-linux-gnu/4.4.3/include/varargs.h:5:2:error:#error修改您的代码以使用< stdarg.h> ;.
在/usr/local/include/ruby-1.9.1/ruby/intern.h:29包含的文件中,从/usr/local/include/ruby-1.9.1/ruby/ruby获得
.h:1327,来自rubyext.c的
:1:
/usr/local/include/ruby-1.9.1/ruby/st.h:122:错误:期望的声明说明符或'.. '''uint32_t'
在/usr/local/include/ruby-1.9.1/ruby/ruby.h:1327包含的文件中,从rubyext.c获得
:1:
/usr/local/include/ruby-1.9.1/ruby/intern.h:508:错误:期望的声明说明符或'...'在'rb_pid_t'之前
/usr/local/include/ruby-1.9 .1 / ruby​​ / intern.h:526:error:expected'=',',',';','asm'或'__attribute__'在'rb_fork'之前
/ usr / local / include / ruby​​- 1.9.1 / ruby​​ / intern.h:527:error:expected'=',',';','asm'或'__attribute__''rb_fork_err'
/ usr / local / include / ruby -1.9.1 / ruby​​ / intern.h:529:error:expected'=',',',';','asm'或'__attribute__'before 'rb_waitpid'
/usr/local/include/ruby-1.9.1/ruby/intern.h:530:error:expected')'before'pid'
/ usr / local / include / ruby -1.9.1 / ruby​​ / intern.h:531:在'rb_spawn'之前预期'=',',',';','asm'或'__attribute__'
/ usr / local / include /在'rb_spawn_err'
/ usr / local / include之前ruby-1.9.1 / ruby​​ / intern.h:532:error:expected'=',',',';','asm'或'__attribute__' /ruby-1.9.1/ruby/intern.h:534:error:expected')''pid'之前
/usr/local/include/ruby-1.9.1/ruby/intern.h:652:错误:期望的声明说明符或'...'在'uint32_t'之前

我做错了吗?我的rubyext.c文件只有一行代码:

  #include< ruby​​.h> 

非常感谢您的任何帮助。

解决方案

当然,你不能只包含头文件,你必须链接到Ruby库。



阅读本章来自Pickaxe。



也可以随意浏览我在github上的一些回购信息,我写了很多C扩展。



如果您需要帮助,请在该网站上向我发送消息。


I want to create a ruby extension that uses c. But when I compile it with gcc, I am getting this error:

gcc rubyext.c -orubyext -I /usr/local/include/ruby-1.9.1/

In file included from rubyext.c:1:
/usr/local/include/ruby-1.9.1/ruby/ruby.h:25:25: error: ruby/config.h: No such file or directory
In file included from rubyext.c:1:
/usr/local/include/ruby-1.9.1/ruby/ruby.h:107: error: ‘SIZEOF_INT’ undeclared here (not in a function)
/usr/local/include/ruby-1.9.1/ruby/ruby.h:108: error: ‘SIZEOF_LONG’ undeclared here (not in a function)
/usr/local/include/ruby-1.9.1/ruby/ruby.h:112: error: ‘SIZEOF_VOIDP’ undeclared here (not in a function)
In file included from /usr/local/include/ruby-1.9.1/ruby/ruby.h:1326,
                 from rubyext.c:1:
/usr/local/include/ruby-1.9.1/ruby/missing.h:25: error: redefinition of ‘struct timeval’
/usr/local/include/ruby-1.9.1/ruby/missing.h:35: error: redefinition of ‘struct timespec’
In file included from /usr/local/include/ruby-1.9.1/ruby/intern.h:27,
                 from /usr/local/include/ruby-1.9.1/ruby/ruby.h:1327,
                 from rubyext.c:1:
/usr/lib/gcc/x86_64-linux-gnu/4.4.3/include/varargs.h:4:2: error: #error "GCC no longer implements <varargs.h>."
/usr/lib/gcc/x86_64-linux-gnu/4.4.3/include/varargs.h:5:2: error: #error "Revise your code to use <stdarg.h>."
In file included from /usr/local/include/ruby-1.9.1/ruby/intern.h:29,
                 from /usr/local/include/ruby-1.9.1/ruby/ruby.h:1327,
                 from rubyext.c:1:
/usr/local/include/ruby-1.9.1/ruby/st.h:122: error: expected declaration specifiers or ‘...’ before ‘uint32_t’
In file included from /usr/local/include/ruby-1.9.1/ruby/ruby.h:1327,
                 from rubyext.c:1:
/usr/local/include/ruby-1.9.1/ruby/intern.h:508: error: expected declaration specifiers or ‘...’ before ‘rb_pid_t’
/usr/local/include/ruby-1.9.1/ruby/intern.h:526: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘rb_fork’
/usr/local/include/ruby-1.9.1/ruby/intern.h:527: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘rb_fork_err’
/usr/local/include/ruby-1.9.1/ruby/intern.h:529: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘rb_waitpid’
/usr/local/include/ruby-1.9.1/ruby/intern.h:530: error: expected ‘)’ before ‘pid’
/usr/local/include/ruby-1.9.1/ruby/intern.h:531: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘rb_spawn’
/usr/local/include/ruby-1.9.1/ruby/intern.h:532: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘rb_spawn_err’
/usr/local/include/ruby-1.9.1/ruby/intern.h:534: error: expected ‘)’ before ‘pid’
/usr/local/include/ruby-1.9.1/ruby/intern.h:652: error: expected declaration specifiers or ‘...’ before ‘uint32_t’

Did I do it wrong? My rubyext.c file only has one line of code:

#include <ruby.h>

Any help is greatly appreciated.

解决方案

Of course you cannot just include the header files, you must link to the Ruby library.

Read This chapter from the Pickaxe.

Also feel free to browse some of my repos on github, I write a lot of C extensions.

Send me a message on that site if you need help.

这篇关于如何编译/创建一个使用c的ruby扩展?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆