
我有主要的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.rbcreating Makefile$makecompiling foo.cpplinking shared-object foo.so$lsMakefile extconf.rb foo.cpp foo.o foo.so
然后,我有一个Ruby脚本test.rb:
#!/usr/bin/env rubyrequire "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
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人,所以我希望我没有把这个术语搞得太严厉.
总结以上是内存溢出为你收集整理的编译Ruby C扩展全部内容,希望文章能够帮你解决编译Ruby C扩展所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)