2

我有一个用 C 语言编写的控制硬件设备的项目。我正在尝试从 Ruby 应用程序访问我的项目中的 DLL 函数,以便从 Ruby Web 应用程序控制硬件。我无法使用 FFI 和 Fiddle 加载 dll 项目文件。有没有人可以用一个例子来分享一个类似的案例?

谢谢。

4

1 回答 1

2

我建议使用 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
于 2018-01-31T09:58:37.343 回答