создание расширения ruby ​​для библиотеки C ++ в C

я пытался построить расширение ruby ​​для библиотеки C ++. Сначала я сделал обертывание кода C ++ в C. Я собираю его, используя Eclipse IDE, и он работает нормально. Затем я пытаюсь построить расширение ruby ​​для этого источника C. вот код, который я попробовал.

/ *
* Circle.h
*
* Создано 18 сентября 2013
* Автор: kelum
* /

#ifndef CIRCLE_H_
#define CIRCLE_H_

namespace lemon{
class Circle {
public:
Circle(float radius):_radius(radius) {}
float getArea() { return 3.14159 * _radius * _radius; }
private:
float _radius;

};
}

/ *
* Circle_w.h
*
* Создано 18 сентября 2013
* Автор: kelum
* /

#ifndef CIRCLE_W_H_
#define CIRCLE_W_H_

#ifdef __cplusplus
extern "C" {
#endif

extern void *Circle_C_new(float radius);
extern void  *Circle_C_delete(void *circle);
extern float Circle_C_getArea(void *circle);

#ifdef __cplusplus
}
#endif

#endif /* CIRCLE_W_H_ */

/ *
* Circle_w.cpp
*
* Создано 18 сентября 2013
* Автор: kelum
* /

#include "Circle_w.h"#include "Circle.h"using namespace lemon;

extern void *Circle_C_new(float radius) {
return new Circle(radius);
}

extern void *Circle_C_delete(void *circle) {
Circle *c = (Circle *)circle;
//delete c;
return c;
}

extern float Circle_C_getArea(void *circle) {
Circle *c = (Circle *)circle;
return c->getArea();
}

main.c

#include "Circle_w.h"#include <stdio.h>
#include <stdlib.h>

int main() {
float radius = 1.5;

// Get a pointer to a Circle object
void *circle = Circle_C_new(radius);

// Pass the Circle object to the wrapper methods
float area = Circle_C_getArea(circle);

printf ("Circle of radius %f has area %f\n", radius, area);

// Free the Circle object memory
void *pointer=Circle_C_delete(circle);

return 0;
}

эта работа отлично. Затем я строю файл C, используя заголовочный файл Circle_w.h. Этот файл.

#include "ruby.h"#include "Circle_w.h"#include <stdio.h>

extern VALUE method_test(){
float r=1.5;
void *circle = Circle_C_new(r);
int area = (int)Circle_C_getArea(circle);
printf("area %d \n",area);
return INT2NUM(area);
}

extern void Init_TestLemon() {
VALUE lemon = rb_define_module("TestLemon");
rb_define_method(lemon, "test", method_test, 0);
}

файл extconf.rb

require 'mkmf'
extension_name = 'TestLemon'
dir_config(extension_name)
create_makefile(extension_name)

и это класс ruby, который я использовал для тестирования модуля.

файл test.rb

require '/home/kelum/workspace/Test/TestLemon'
include TestLemon
puts test

проблема в том, как я могу скомпилировать это вместе? когда я просто запускаю extconf.rb и test.rb, это показывает ошибку.

 TestLemon.so: undefined symbol: Circle_C_new

Я думаю, это потому, что extconf.rb не выполняет сборку C ++. как я могу сделать эту работу?
Спасибо большое.

2

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]