加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

编译Ruby C扩展

发布时间:2020-12-17 02:01:37 所属栏目:百科 来源:网络整理
导读:我正在尝试为 Ruby编译一个c扩展,并且编译不会返回错误,但它似乎没有正确编译.我究竟做错了什么? 我有主要的cpp脚本foo.cpp: #include iostream#include ruby.hextern "C"VALUE cFoo;void Init_foo(){cFoo = rb_define_class("Foo",rb_cObject);} 和extcon
我正在尝试为 Ruby编译一个c扩展,并且编译不会返回错误,但它似乎没有正确编译.我究竟做错了什么?

我有主要的cpp脚本foo.cpp:

#include <iostream>
#include <ruby.h>
extern "C"

VALUE cFoo;
void Init_foo(){cFoo = rb_define_class("Foo",rb_cObject);}

和extconf.rb:

require "mkmf"
$libs += " -lstdc++ "
create_makefile("foo")

在这些文件的目录中,我做到了

$ruby extconf.rb
creating Makefile
$make
compiling foo.cpp
linking shared-object foo.so
$ls
Makefile extconf.rb foo.cpp foo.o foo.so

然后,我有一个Ruby脚本test.rb:

#!/usr/bin/env ruby
require "path_to_this_directory/foo"

我运行test.rb.它返回一个错误:

... in `require': .../foo.so: undefined symbol: cFoo - .../foo.so (LoadError)

我究竟做错了什么?

环境

>操作系统:Ubuntu Linux 11.10
> Ruby:1.9.3

解决方法

你宣称cFoo存在:

extern "C"

VALUE cFoo;

但你永远不会定义它.说外部“C”blahblah只是说blahblah存在,它是外部可见的,并且它的名字不会被破坏(即“C”链接),但外部声明实际上并没有定义任何东西; extern说存在某些东西,但它并没有使它存在.

你的C看起来应该更像这样:

#include <iostream>
#include <ruby.h>

extern "C" VALUE cFoo;
extern "C" void Init_foo();

VALUE cFoo;
void Init_foo(){cFoo = rb_define_class("Foo",rb_cObject);}

您需要两个extern“C”来告诉C编译器单独保留名称,然后分离符号的定义.你也可以这样说:

#include <iostream>
#include <ruby.h>

extern "C" VALUE cFoo;

VALUE cFoo;
extern "C" void Init_foo(){cFoo = rb_define_class("Foo",rb_cObject);}

我不确定第二个版本是标准C还是GCC扩展.

我不是一个C人,所以我希望我没有把这个术语搞得太严厉.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读