【问题标题】:SWIG: Ruby overloading problemsSWIG:Ruby 重载问题
【发布时间】:2011-04-27 11:21:39
【问题描述】:

我有一个sinatra Web 应用程序和一个 C++ 库,我可以使用 swig 创建的绑定在 sinatra (ruby) 中“要求”它们。

我还有第二个非常相似的库,其中的函数名称与第一个库中的部分相同。当我同时需要它们时,首先加载的那个会“获胜”,即对不明确的函数名称的调用总是映射到这个库。

原因是 'require' 只加载尚未加载的内容,而 'load' 无论如何都会重新加载。但是,“加载”似乎不适用于 .so 文件,仅适用于 ruby​​ 源文件。有什么帮助吗?

谢谢

【问题讨论】:

    标签: ruby load sinatra swig require


    【解决方案1】:

    require 在 $" 数组中查找模块 should be reloaded. 您可以尝试删除它并要求。不过,不确定这是否适用于您的用例,因为似乎仍然可以保留命名空间被污染了。

    irb(main):001:0> require 'mysql'
    => true
    irb(main):002:0> require 'mysql'
    => false
    irb(main):003:0> $".delete('mysql.so')
    => "mysql.so"
    irb(main):004:0> require 'mysql'
    /usr/lib64/ruby/site_ruby/1.8/x86_64-linux/mysql.so: warning: already initialized constant MysqlRes
    /usr/lib64/ruby/site_ruby/1.8/x86_64-linux/mysql.so: warning: already initialized constant MysqlField
    /usr/lib64/ruby/site_ruby/1.8/x86_64-linux/mysql.so: warning: already initialized constant MysqlError
    /usr/lib64/ruby/site_ruby/1.8/x86_64-linux/mysql.so: warning: already initialized constant VERSION
    /usr/lib64/ruby/site_ruby/1.8/x86_64-linux/mysql.so: warning: already initialized constant OPT_CONNECT_TIMEOUT
    /usr/lib64/ruby/site_ruby/1.8/x86_64-linux/mysql.so: warning: already initialized constant OPT_COMPRESS
    /usr/lib64/ruby/site_ruby/1.8/x86_64-linux/mysql.so: warning: already initialized constant OPT_NAMED_PIPE
    <snip>
    => true 
    

    【讨论】:

    • 在我的情况下没有帮助::-( 从 $" 中删除条目后,我仍然无法重新加载。irb(main):004:0> require 'libbbrc/bbrc.so' => 错误
    • 在这里有效!将看到,命名空间是否被污染。抱歉之前的评论。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-25
    • 2019-06-24
    • 2019-09-14
    相关资源
    最近更新 更多