代码之家  ›  专栏  ›  技术社区  ›  Joshua Partogi

如何编译/创建使用c的ruby扩展?

  •  1
  • Joshua Partogi  · 技术社区  · 14 年前

    我想创建一个使用c的ruby扩展,但是当我用gcc编译它时,我得到了一个错误:

    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’
    

    #include <ruby.h>
    

    任何帮助都非常感谢。

    1 回复  |  直到 12 年前
        1
  •  2
  •   horseyguy    14 年前

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

    阅读 This chapter from the Pickaxe.

    browse some of my repos on github ,我写了很多C扩展。

    如果你需要帮助,请在那个网站上给我留言。