Gem 如何调用 C 的动态库扩展

hjf_coding · February 28, 2019 · 7342 hits

环境

linux  Centos 6.6
ruby 2.1.1

目标

在 linux 环境下 通过 ruby 调用可执行文件、动态库 .so 文件

安装 gem

gem install dl

一、ruby 调用可执行文件
1:做好的文件代码 如 test.c 文件 编译后的 test_ruby 需要赋予可执行文件权限 命令:chmod 700 test_ruby
2:使用system()函数调用 linux 命令 方式与在 shell 中使用是一样的

参考文件
http://blog.csdn.net/renwotao2009/article/details/51892300
http://www.jb51.net/article/59939.htm
http://www.2cto.com/os/201309/246511.html

二、ruby 调用动态库文件 (关键要知道你要调用的动态库文件的功能 参数 就是要知道接口是什么)

bash $> cat > sum.c <<EOF
double sum(double *arry, int len)
{
        double ret = 0;
        int i;
        for(i = 0; i < len; i++){
                ret = ret + arry[i];
        }
        return ret;
}
double split(double num)
{
        double ret = 0;
        ret = num / 2;
        return ret;
}
EOF
bash $> gcc -o libsum.so -shared sum.c
bash $> cat > sum.rb <<EOF
require 'dl'
require 'dl/import'
module LibSum
        extend DL::Importer
        dlload './libsum.so'
        extern 'double sum(double*, int)'
        extern 'double split(double)'
end
a = [2.0, 3.0, 4.0]
sum = LibSum.sum(a.pack("d*"), a.count)
p LibSum.split(sum)
EOF
bash $> ruby sum.rb #=>4.5

参考文件
http://ju.outofmemory.cn/entry/142961
http://www.kuqin.com/rubycndocument/
http://www.kuqin.com/rubycndocument/man/addlib/index.html
http://www.kuqin.com/rubycndocument/man/addlib/dl.html
https://ruby-china.org/topics/20644
https://ruby-china.org/topics/7728
http://ruby-doc.org/stdlib-1.9.3/libdoc/dl/rdoc/DL.html#method-c-dlopen

No Reply at the moment.
You need to Sign in before reply, if you don't have an account, please Sign up first.