首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >编译Ruby C++扩展

编译Ruby C++扩展
EN

Stack Overflow用户
提问于 2012-04-15 23:39:23
回答 1查看 943关注 0票数 4

我正在为Ruby编译一个c++扩展,编译不会返回一个错误,但它似乎没有正确编译。我做错了什么?

我有主cpp脚本foo.cpp

代码语言:javascript
复制
#include <iostream>
#include <ruby.h>
extern "C"

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

extconf.rb

代码语言:javascript
复制
require "mkmf"
$libs += " -lstdc++ "
create_makefile("foo")

在这些文件的目录中,我

代码语言:javascript
复制
$ 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

代码语言:javascript
复制
#!/usr/bin/env ruby
require "path_to_this_directory/foo"

我负责test.rb。它返回一个错误:

代码语言:javascript
复制
... in `require': .../foo.so: undefined symbol: cFoo - .../foo.so (LoadError)

我做错了什么?

环境

  • OS: UbuntuLinux11.10
  • Ruby: 1.9.3
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-04-16 00:21:10

您正在声明cFoo存在:

代码语言:javascript
复制
extern "C"

VALUE cFoo;

但你从来没有定义过它。说extern "C" blahblah只是说blahblah是存在的,它在外部是可见的,而且它的名字不会被破坏。( "C“链接)但是extern声明实际上没有定义任何东西;extern说有些东西是存在的,但它不存在。

您的C++应该更像这样:

代码语言:javascript
复制
#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++编译器不要使用名称,然后对符号进行单独的定义。你也可以这样说:

代码语言:javascript
复制
#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++的人,所以我希望我没有把术语搞得太糟。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10167149

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档