我有一个用 C 语言编写的控制硬件设备的项目。我正在尝试从 Ruby 应用程序访问我的项目中的 DLL 函数,以便从 Ruby Web 应用程序控制硬件。我无法使用 FFI 和 Fiddle 加载 dll 项目文件。有没有人可以用一个例子来分享一个类似的案例?
谢谢。
我建议使用 SWIG ( http://swig.org )
我会给你一个关于 OSX 的例子,但你也可以在 Windows 上找到等效的例子。
假设您有一个带有此头文件的库(在我的情况下为 hello.bundle 或在您的情况下为 hello.DLL)hello.h
#ifndef __HELLO__
#define __HELLO__
extern void say_hello(void);
#endif
你想say_hello
从像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