我正在为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)我做错了什么?
环境
发布于 2012-04-16 00:21:10
您正在声明cFoo存在:
extern "C"
VALUE cFoo;但你从来没有定义过它。说extern "C" blahblah只是说blahblah是存在的,它在外部是可见的,而且它的名字不会被破坏。( "C“链接)但是extern声明实际上没有定义任何东西;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++的人,所以我希望我没有把术语搞得太糟。
https://stackoverflow.com/questions/10167149
复制相似问题