Rails rails 调用.so 文件类型的共享链接库

howiloveyou · December 20, 2012 · Last by tonyandruby replied at December 27, 2019 · 5451 hits

model 中要使用一个.so 中的方法 (so 为 c/c++ 写的代码提供给 ruby 使用),目前在 ruby 下可以调用成功,但在 rails 中使用时报找不到.so 文件或目录?

1、怎么在 rails 中配置.so 共享链接库路径? 2、怎么在 model 中调用.so 中的方法? 3、哪儿有例子?及一使用时的注意事项?

谢谢。

一般是 path 问题

#1 楼 @zgm 杂在代码里设置呢?

$: << "/home/xxx" 这样?

#3 楼 @sevk 不知道呢,现在对 rails 调用 so 的整个流程不懂。

设下 LD_LIBRARY_PATH 环境?

#5 楼 @lululau ruby 运行的时候设置了,但 rails 环境中不知道啷个设置,ENV?,好像不管用耶。

rails 里放到 lib 目录,或者在 config/application.rb 的最后加一行 (假设是 /home/xxx/y.so)

require '/home/xxx/y.so'

或者像 #3 楼说的那样

$:.unshift "/home/xxx" # 这里最好用 unshift, 后面追加的话, 如果你的 so 和某个文件同名就载不来了
require 'y' # 这里不用加扩展名也可以哦

#4 楼 @howiloveyou 只要 xxx.so 在 $: 列表里面,就可以直接 require 'xxx.so' .

如果 xxx.so 是 for c++ 的,不是 for ruby 的,则用 dlopen :

win32 dll:

require 'dl'
user32 = DL.dlopen('user32')
msgbox = user32['MessageBoxA', 'ILSSI']
msgbox.call(0, "Hello", "Message Box", 0)

linux so: http://www.ruby-doc.org/stdlib-1.9.3/libdoc/dl/rdoc/DL.html

hjf_coding in 如何调用 C 的动态库扩展 mention this topic. 28 Feb 16:01

@howiloveyou 大佬 借楼问一下 ruby 如何调用 so 库呢?我尝试过下面这张方式 但是失败了

bash# cp rubytest.so /opt/test

bash# export RUBYLIB=$RUBYLIB:/opt/test

bash# irb

irb> require 'rubytest'

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