Я следую учебному пособию для Руби Райс в http://rice.rubyforge.org/index.html. Моя конечная цель — обернуть объект с ++, который у меня уже запущен, но вызывать его из Ruby.
В следующем уроке я могу создать класс C ++ и вызвать методы, которые я определяю, однако, как только я попаду в обертку ранее существующего объекта C ++, я получу ошибку поиска символа:
cam@Pele:~/localProjects/rubyTest$ ruby extconf.rb
creating Makefile
cam@Pele:~/localProjects/rubyTest$ make
linking shared-object Test.so
cam@Pele:~/localProjects/rubyTest$ irb
irb(main):001:0> require './Test'
=> true
irb(main):002:0> test=Test.new
irb: symbol lookup error: /home/cam/localProjects/rubyTest/Test.so: undefined symbol: _ZN4TestC1Ev
extconf.rb:
require 'mkmf-rice'
create_makefile('Test')
test.cpp
#include "rice/Data_Type.hpp"#include "rice/Constructor.hpp"
using namespace Rice;
class Test
{
public:
Test();
std::string sayHello()
{
return std::string("hello");
}
};
extern "C"void Init_Test()
{
Data_Type<Test> rb_cTest =
define_class<Test>("Test")
.define_constructor(Constructor<Test>())
.define_method("hello", &Test::sayHello);
}
У меня очень мало опыта в рубине, нет в Райсе. Я делаю что-то неправильно? Кажется, я не знаю достаточно об общих библиотеках для полной отладки. Если это поможет, я получаю это при запуске ldd -d -r Test.so
linux-vdso.so.1 => (0x00007fff5efff000)
libruby-1.9.1.so.1.9 => /usr/lib/libruby-1.9.1.so.1.9 (0x00007fd24539b000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007fd24517e000)
libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007fd244e7d000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fd244abe000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007fd2448a8000)
librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007fd24469f000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007fd24449b000)
libcrypt.so.1 => /lib/x86_64-linux-gnu/libcrypt.so.1 (0x00007fd244262000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fd243f65000)
/lib64/ld-linux-x86-64.so.2 (0x00007fd2459fb000)
undefined symbol: _ZN4TestC1Ev (./Test.so)
но я не понимаю, почему он не определен, когда класс пришел из того же файла.
Чего мне не хватает и почему это происходит?
Ваш конструктор, кажется, просто объявленный не определенный :
class Test
{
public:
Test(); // <- Just declared.
// ...
};
Просто попробуй :
class Test
{
public:
Test() {} // <- Now defined
// ...
};
По вашей ошибке он ищет определение конструктора безуспешно.
_ZN4TestC1Ev
это имя вашего конструктора украшен во время компиляции. Ищи название искажения.
Других решений пока нет …