【问题标题】:pg_ext.so: undefined symbol: rb_thread_selectpg_ext.so:未定义符号:rb_thread_select
【发布时间】:2016-09-02 04:22:36
【问题描述】:
bash-4.2# rake db:create
/opt/rubystack-2.3.1-0/ruby/bin/.ruby.bin: symbol lookup error: /opt/rubystack-2.3.1-0/ruby/lib/ruby/gems/2.3.0/gems/pg-0.18.4/lib/pg_ext.so: undefined symbol: rb_thread_select
bash-4.2# ruby -v
ruby 2.3.1p112 (2016-04-26 revision 54768) [x86_64-linux]
bash-4.2# rails -v
Rails 4.2.6
bash-4.2# gem list pg

*** LOCAL GEMS ***



  pg (0.18.4, 0.15.1)

有什么问题?这是 bitnami 的 ruby​​ 堆栈。

注意:这不是pg版本的错误?请检查我的日志! Ruby 2.3.1 版,pg 0.18.4 版。

【问题讨论】:

    标签: ruby ruby-on-rails-4 bitnami pg ruby-c-extension


    【解决方案1】:

    自 Ruby 1.9.3 起,rb_thread_select 函数已被弃用。从 Ruby 2.2 开始,它被 rb_thread_fd_select 函数取代:

    VA  VD  VR
    old 193 22  rb_thread_select -> rb_thread_fd_select
    

    但是,pg gem has been using the correct function 自版本 0.15 起。这是pg_connection.c @ e5cb1df的相关部分:

    #ifndef HAVE_RB_THREAD_FD_SELECT
    #define rb_fdset_t fd_set
    #define rb_fd_init(f)
    #define rb_fd_zero(f)  FD_ZERO(f)
    #define rb_fd_set(n, f)  FD_SET(n, f)
    #define rb_fd_term(f)
    #define rb_thread_fd_select rb_thread_select
    #endif
    

    这些指令是在编译时评估的,所以 C 扩展的共享对象一定是编译不正确的。

    HAVE_RB_THREAD_FD_SELECT 宏在构建 pg_ext.so 时一定没有定义。这可能是因为:

    • 它是针对没有 rb_thread_fd_select 的 Ruby 构建的
    • 在构建过程中配置不正确

    参考资料:

    【讨论】:

    • It was built against a Ruby that did not have rb_thread_fd_select: 你的意思是,当安装包时,它指向一个坏的 ruby​​ 版本?@Matheus Moreira
    • @Albert.Qing,如果您自己安装了 gem 并且当时它构建了扩展,那么构建系统检查的 Ruby 可能没有 rb_thread_fd_select 功能。所以,它可能不是最新版本;也许是旧系统 Ruby?
    • 你解决了我的难题,我猜bitnami的红宝石可能有问题,谢谢@Matheus Moreira
    • @Albert.Qing 那么您是如何着手进行的呢?我面临同样的问题:) #bitnamiFtw
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-02
    • 2012-11-07
    • 2012-09-05
    • 2017-06-25
    相关资源
    最近更新 更多