Доступ к 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