架构x86_64的未定义符号:"_rb_funcallv"

3

我正在尝试从C语言调用Ruby,但是出现了一些问题,无法执行rb_funcall2rb_funcall3。然而,rb_funcall可以正常工作。

以下是我的示例代码:

Hello.c

#include <ruby.h>

void hello_from_ruby()
{
  if (ruby_setup())
    {
        fprintf(stderr, "Failed to init Ruby VM\n");
    }

    rb_require("/test");
    rb_funcall2(0, rb_intern("some_ruby_method"), 0, NULL);    

    ruby_cleanup(0);
  }

int main(int argc, char* argv[])
{
  hello_from_ruby();
  return 0;
}

test.rb

def some_ruby_method
  puts "Hello from ruby"
end

执行的命令:

clang hello.c  -o hello -I/opt/rubies/2.1.0/include/ruby-2.1.0  -I/opt/rubies/2.1.0/include/ruby-2.1.0/x86_64-darwin14.0  -lruby

异常情况:

Undefined symbols for architecture x86_64:
  "_rb_funcallv", referenced from:
      _hello_from_ruby in hello-190761.o
ld: symbol(s) not found for architecture x86_64

由于某些原因,只有这两种方法没有被链接。

我的问题是:如何在我的代码中链接rb_funcall2


你有什么问题? - sawa
1
我遇到了一个异常,但不知道如何解决。我认为这很明显。 - Marcio Klepacz
1
这篇帖子应该会有所帮助。ryanmelt的回答指出,你必须使用编译过的ruby c-lang。 - LPs
之前尝试过了,但是没有成功 :( 谢谢。 - Marcio Klepacz
我得到了相同的错误信息。这是在 ../lib 目录下的内容:libruby-static.a libyaml-0.2.dylib libyaml.a libyaml.dylib libyaml.la pkgconfig ruby - Marcio Klepacz
1个回答

1
问题在于我的 Ruby 是使用 gcc 编译的,所以我必须重新编译为 clang:
CC=clang CONFIGURE_OPTS="--with-gcc=clang --enable-shared" ruby-build 2.1.0 /opt/rubies/2.1.0

我查看了这个问题后,找到了解决方法:https://github.com/ryanmelt/qtbindings/issues/72
谢谢。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接