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)
config/application.rb
require '/home/xxx/y.so'
或者像 #3 楼说的那样
$:.unshift "/home/xxx" # 这里最好用 unshift, 后面追加的话, 如果你的 so 和某个文件同名就载不来了 require 'y' # 这里不用加扩展名也可以哦
#7 楼 @luikore OK。
#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
#10 楼 @sevk 嗯 挻好的。
@howiloveyou 大佬 借楼问一下 ruby 如何调用 so 库呢?我尝试过下面这张方式 但是失败了
bash# cp rubytest.so /opt/test
bash# export RUBYLIB=$RUBYLIB:/opt/test
bash# irb
irb> require 'rubytest'