Доступ к DLL-функции на C-проекте из Ruby

У меня есть проект, написанный на C, управляющий аппаратными устройствами. Я пытаюсь получить доступ к функциям DLL в моих проектах из приложения Ruby, чтобы управлять оборудованием из веб-приложения Ruby. Я не могу загрузить файлы проекта DLL, используя FFI и Fiddle. У кого-нибудь есть пример, который я могу использовать, чтобы поделиться похожим случаем?

Благодарю.

1 ответ

Решение

Я предлагаю использовать SWIG ( http://swig.org/)

Я приведу пример для OSX, но вы также можете найти аналог для Windows.

Допустим, у вас есть библиотека (в моем случае hello.bundle или в вашем случае hello.DLL) с этим заголовочным файлом hello.h

#ifndef __HELLO__
#define __HELLO__

extern void say_hello(void); 

#endif

и ты хочешь позвонить say_hello из такой программы ruby ​​run.rb:

# file: run.rb
require 'hello'

# Call a c function
Hello.say_hello

(Обратите внимание, что имя модуля имеет заглавные буквы)

что вам нужно сделать, это создать файл hello.i как это:

%module hello
 %{
 #include "hello.h"
 %}

 // Parse the original header file
 %include "hello.h"

И затем выполните команду:

swig -ruby hello.i

Это сгенерирует файл .c это оболочка, которая будет установлена ​​как модуль оболочки для вашей среды ruby: hello_wrap.c,

Затем вам нужно создать файл extconf.rb с этим содержанием:

require 'mkmf'
create_makefile('hello')

Обратите внимание, что здесь "hello" - название нашего модуля в файле .i,

Тогда ты должен бежать ruby extconf.rb это сгенерирует Makefile.

ruby extconf.rb    
creating Makefile

Затем вы должны ввести make это скомпилирует _wrap.c файл против библиотеки (в моем случае.bundle в вашем случае.DLL).

make
compiling hello_wrap.c
linking shared-object hello.bundle

Теперь вы должны ввести make install (или sudo make install в Unix/Osx)

sudo make install
Password:
/usr/bin/install -c -m 0755 hello.bundle /Library/Ruby/Site/2.3.0/universal-darwin17

Затем вы можете запустить вашу программу run.rb

ruby run.rb 
Hello, world!

Я буду вставлять здесь ниже .c файл, используемый для создания библиотеки hello.bundle

#include <stdio.h>
#include "hello.h"

void say_hello(void) {
    printf("Hello, world!\n");
    return;
}

Если вы оставите этот файл вместе с .h файл Makefile создаст библиотеку для вас

make
compiling hello.c
compiling hello_wrap.c
linking shared-object hello.bundle
Другие вопросы по тегам