【问题标题】:gem install pg can not bind to libpqgem install pg 无法绑定到 libpq
【发布时间】:2013-08-09 19:56:42
【问题描述】:

在 Ubuntu 10.04.3 上升级到 Ruby 1.9.3(使用系统 RVM 从 1.9.2)后,我删除了所有 gem,并尝试重新安装 pg(ala bundle install pg)。

然后它抛出一个错误并通知我应该查看 mkmf.log,这两个都包含在这个要点中:https://gist.github.com/d05a81701d968895c730

libpq-dev、libpq5 和 postgresql-client 均已安装且工作正常。 将gem指向pg_config,直接include和bin目录似乎没有任何改变。

我已经看到几个关于 stackoverflow 和 web 其他部分的类似错误消息的问题,但它们似乎都是简单的缺少依赖问题(其中大部分是通过安装 libpq-dev 解决的),所以我有点吃亏。

可能有用/相关的各种其他属性:

  • ruby 1.9.3p0(2011-10-30 修订版 33570)[i686-linux]
  • rvm 1.10.1(系统)
  • 宝石 1.8.15
  • psql (PostgreSQL) 8.4.9

提前致谢。

gem_make.out:

Gem::Installer::ExtensionBuildError: ERROR: Failed to build gem native extension.

        /usr/local/rvm/rubies/ruby-1.9.3-p0/bin/ruby extconf.rb
checking for pg_config... yes
Using config values from /usr/bin/pg_config
checking for libpq-fe.h... yes
checking for libpq/libpq-fs.h... yes
checking for PQconnectdb() in -lpq... no
checking for PQconnectdb() in -llibpq... no
checking for PQconnectdb() in -lms/libpq... no
Can't find the PostgreSQL client library (libpq)
*** extconf.rb failed ***
Could not create Makefile due to some reason, probably lack of
necessary libraries and/or headers. Check the mkmf.log file for more
details. You may need configuration options.

ldd.stdout:

$ldd /usr/lib/libpq.so
    linux-gate.so.1 =>  (0xf57fe000)
    libssl.so.0.9.8 => /lib/i686/cmov/libssl.so.0.9.8 (0xb77f4000)
    libcrypto.so.0.9.8 => /lib/i686/cmov/libcrypto.so.0.9.8 (0xb76a2000)
    libkrb5.so.3 => /usr/lib/libkrb5.so.3 (0xb75f1000)
    libcom_err.so.2 => /lib/libcom_err.so.2 (0xb75ec000)
    libgssapi_krb5.so.2 => /usr/lib/libgssapi_krb5.so.2 (0xb75bd000)
    libcrypt.so.1 => /lib/tls/i686/cmov/libcrypt.so.1 (0xb758b000)
    libldap_r-2.4.so.2 => /usr/lib/libldap_r-2.4.so.2 (0xb7544000)
    libpthread.so.0 => /lib/tls/i686/cmov/libpthread.so.0 (0xb752b000)
    libc.so.6 => /lib/tls/i686/cmov/libc.so.6 (0xb73d0000)
    libdl.so.2 => /lib/tls/i686/cmov/libdl.so.2 (0xb73cc000)
    libz.so.1 => /lib/libz.so.1 (0xb73b7000)
    libk5crypto.so.3 => /usr/lib/libk5crypto.so.3 (0xb7393000)
    libkrb5support.so.0 => /usr/lib/libkrb5support.so.0 (0xb738b000)
    libkeyutils.so.1 => /lib/libkeyutils.so.1 (0xb7386000)
    libresolv.so.2 => /lib/tls/i686/cmov/libresolv.so.2 (0xb7372000)
    /lib/ld-linux.so.2 (0xb786a000)
    liblber-2.4.so.2 => /usr/lib/liblber-2.4.so.2 (0xb7365000)
    libsasl2.so.2 => /usr/lib/libsasl2.so.2 (0xb734d000)
    libgnutls.so.26 => /usr/lib/libgnutls.so.26 (0xb72b2000)
    libtasn1.so.3 => /usr/lib/libtasn1.so.3 (0xb72a0000)
    libgcrypt.so.11 => /lib/libgcrypt.so.11 (0xb722d000)
    libgpg-error.so.0 => /lib/libgpg-error.so.0 (0xb7228000)

pgconfig.stdout:

$pg_config --ldflags --libs

-Wl,-Bsymbolic-functions -Wl,--as-needed -Wl,--as-needed
-lpgport -lxslt -lxml2 -lpam -lssl -lcrypto -lkrb5 -lcom_err -lgssapi_krb5 -lz -lreadline -lcrypt -ldl -lm 

mkmf.log:

find_executable: checking for pg_config... -------------------- yes

--------------------

find_header: checking for libpq-fe.h... -------------------- yes

"gcc -o conftest -I/usr/local/rvm/rubies/ruby-1.9.3-p0/include/ruby-1.9.1/i686-linux -I/usr/local/rvm/rubies/ruby-1.9.3-p0/include/ruby-1.9.1/ruby/backward -I/usr/local/rvm/rubies/ruby-1.9.3-p0/include/ruby-1.9.1 -I. -I/usr/local/rvm/usr/include  -D_FILE_OFFSET_BITS=64  -I/usr/include/postgresql  -O3 -ggdb -Wextra -Wno-unused-parameter -Wno-parentheses -Wno-long-long -Wno-missing-field-initializers -Wpointer-arith -Wwrite-strings -Wdeclaration-after-statement -Wimplicit-function-declaration  -fPIC conftest.c  -L. -L/usr/local/rvm/rubies/ruby-1.9.3-p0/lib -Wl,-R/usr/local/rvm/rubies/ruby-1.9.3-p0/lib -L/usr/local/rvm/usr/lib -Wl,-R/usr/local/rvm/usr/lib -L.  -rdynamic -Wl,-export-dynamic -L/usr/lib     -Wl,-R -Wl,/usr/local/rvm/rubies/ruby-1.9.3-p0/lib -L/usr/local/rvm/rubies/ruby-1.9.3-p0/lib -lruby  -lpthread -lrt -ldl -lcrypt -lm   -lc"
checked program was:
/* begin */
1: #include "ruby.h"
2: 
3: int main() {return 0;}
/* end */

"gcc -E -I/usr/local/rvm/rubies/ruby-1.9.3-p0/include/ruby-1.9.1/i686-linux -I/usr/local/rvm/rubies/ruby-1.9.3-p0/include/ruby-1.9.1/ruby/backward -I/usr/local/rvm/rubies/ruby-1.9.3-p0/include/ruby-1.9.1 -I. -I/usr/local/rvm/usr/include  -D_FILE_OFFSET_BITS=64  -I/usr/include/postgresql  -O3 -ggdb -Wextra -Wno-unused-parameter -Wno-parentheses -Wno-long-long -Wno-missing-field-initializers -Wpointer-arith -Wwrite-strings -Wdeclaration-after-statement -Wimplicit-function-declaration  -fPIC  conftest.c -o conftest.i"
checked program was:
/* begin */
1: #include "ruby.h"
2: 
3: #include <libpq-fe.h>
/* end */

--------------------

find_header: checking for libpq/libpq-fs.h... -------------------- yes

"gcc -E -I/usr/local/rvm/rubies/ruby-1.9.3-p0/include/ruby-1.9.1/i686-linux -I/usr/local/rvm/rubies/ruby-1.9.3-p0/include/ruby-1.9.1/ruby/backward -I/usr/local/rvm/rubies/ruby-1.9.3-p0/include/ruby-1.9.1 -I. -I/usr/local/rvm/usr/include  -D_FILE_OFFSET_BITS=64  -I/usr/include/postgresql  -O3 -ggdb -Wextra -Wno-unused-parameter -Wno-parentheses -Wno-long-long -Wno-missing-field-initializers -Wpointer-arith -Wwrite-strings -Wdeclaration-after-statement -Wimplicit-function-declaration  -fPIC  conftest.c -o conftest.i"
checked program was:
/* begin */
1: #include "ruby.h"
2: 
3: #include <libpq/libpq-fs.h>
/* end */

--------------------

have_library: checking for PQconnectdb() in -lpq... -------------------- no

"gcc -o conftest -I/usr/local/rvm/rubies/ruby-1.9.3-p0/include/ruby-1.9.1/i686-linux -I/usr/local/rvm/rubies/ruby-1.9.3-p0/include/ruby-1.9.1/ruby/backward -I/usr/local/rvm/rubies/ruby-1.9.3-p0/include/ruby-1.9.1 -I. -I/usr/local/rvm/usr/include  -D_FILE_OFFSET_BITS=64  -I/usr/include/postgresql  -O3 -ggdb -Wextra -Wno-unused-parameter -Wno-parentheses -Wno-long-long -Wno-missing-field-initializers -Wpointer-arith -Wwrite-strings -Wdeclaration-after-statement -Wimplicit-function-declaration  -fPIC conftest.c  -L. -L/usr/local/rvm/rubies/ruby-1.9.3-p0/lib -Wl,-R/usr/local/rvm/rubies/ruby-1.9.3-p0/lib -L/usr/local/rvm/usr/lib -Wl,-R/usr/local/rvm/usr/lib -L.  -rdynamic -Wl,-export-dynamic -L/usr/lib     -Wl,-R -Wl,/usr/local/rvm/rubies/ruby-1.9.3-p0/lib -L/usr/local/rvm/rubies/ruby-1.9.3-p0/lib -lruby -lpq  -lpthread -lrt -ldl -lcrypt -lm   -lc"
/usr/lib/libpq.so: undefined reference to `X509_STORE_set_flags@OPENSSL_0.9.8'
/usr/lib/libpq.so: undefined reference to `CRYPTO_set_locking_callback@OPENSSL_0.9.8'
/usr/lib/libpq.so: undefined reference to `ENGINE_init@OPENSSL_0.9.8'
/usr/lib/libpq.so: undefined reference to `ENGINE_free@OPENSSL_0.9.8'
/usr/lib/libpq.so: undefined reference to `ENGINE_load_private_key@OPENSSL_0.9.8'
/usr/lib/libpq.so: undefined reference to `ENGINE_finish@OPENSSL_0.9.8'
/usr/lib/libpq.so: undefined reference to `X509_check_private_key@OPENSSL_0.9.8'
/usr/lib/libpq.so: undefined reference to `X509_free@OPENSSL_0.9.8'
/usr/lib/libpq.so: undefined reference to `SSL_CTX_new@OPENSSL_0.9.8'
/usr/lib/libpq.so: undefined reference to `SSL_pending@OPENSSL_0.9.8'
/usr/lib/libpq.so: undefined reference to `TLSv1_method@OPENSSL_0.9.8'
/usr/lib/libpq.so: undefined reference to `X509_STORE_load_locations@OPENSSL_0.9.8'
/usr/lib/libpq.so: undefined reference to `SSL_CTX_set_verify@OPENSSL_0.9.8'
/usr/lib/libpq.so: undefined reference to `ERR_pop_to_mark@OPENSSL_0.9.8'
/usr/lib/libpq.so: undefined reference to `SSL_new@OPENSSL_0.9.8'
/usr/lib/libpq.so: undefined reference to `SSL_get_error@OPENSSL_0.9.8'
/usr/lib/libpq.so: undefined reference to `ERR_get_error@OPENSSL_0.9.8'
/usr/lib/libpq.so: undefined reference to `ENGINE_by_id@OPENSSL_0.9.8'
/usr/lib/libpq.so: undefined reference to `SSL_write@OPENSSL_0.9.8'
/usr/lib/libpq.so: undefined reference to `SSL_load_error_strings@OPENSSL_0.9.8'
/usr/lib/libpq.so: undefined reference to `SSL_CTX_load_verify_locations@OPENSSL_0.9.8'
/usr/lib/libpq.so: undefined reference to `BIO_ctrl@OPENSSL_0.9.8'
/usr/lib/libpq.so: undefined reference to `PEM_read_bio_PrivateKey@OPENSSL_0.9.8'
/usr/lib/libpq.so: undefined reference to `CRYPTO_set_id_callback@OPENSSL_0.9.8'
/usr/lib/libpq.so: undefined reference to `SSL_free@OPENSSL_0.9.8'
/usr/lib/libpq.so: undefined reference to `BIO_free@OPENSSL_0.9.8'
/usr/lib/libpq.so: undefined reference to `SSL_CTX_get_cert_store@OPENSSL_0.9.8'
/usr/lib/libpq.so: undefined reference to `X509_get_subject_name@OPENSSL_0.9.8'
/usr/lib/libpq.so: undefined reference to `SSL_shutdown@OPENSSL_0.9.8'
/usr/lib/libpq.so: undefined reference to `SSL_CTX_set_client_cert_cb@OPENSSL_0.9.8'
/usr/lib/libpq.so: undefined reference to `PEM_read_bio_X509@OPENSSL_0.9.8'
/usr/lib/libpq.so: undefined reference to `ERR_set_mark@OPENSSL_0.9.8'
/usr/lib/libpq.so: undefined reference to `OPENSSL_config@OPENSSL_0.9.8'
/usr/lib/libpq.so: undefined reference to `X509_NAME_get_text_by_NID@OPENSSL_0.9.8'
/usr/lib/libpq.so: undefined reference to `SSL_read@OPENSSL_0.9.8'
/usr/lib/libpq.so: undefined reference to `SSL_CTX_ctrl@OPENSSL_0.9.8'
/usr/lib/libpq.so: undefined reference to `ERR_reason_error_string@OPENSSL_0.9.8'
/usr/lib/libpq.so: undefined reference to `SSL_get_peer_certificate@OPENSSL_0.9.8'
/usr/lib/libpq.so: undefined reference to `X509_NAME_oneline@OPENSSL_0.9.8'
/usr/lib/libpq.so: undefined reference to `SSL_set_ex_data@OPENSSL_0.9.8'
/usr/lib/libpq.so: undefined reference to `SSL_set_fd@OPENSSL_0.9.8'
/usr/lib/libpq.so: undefined reference to `SSL_library_init@OPENSSL_0.9.8'
/usr/lib/libpq.so: undefined reference to `CRYPTO_num_locks@OPENSSL_0.9.8'
/usr/lib/libpq.so: undefined reference to `SSL_get_ex_data@OPENSSL_0.9.8'
/usr/lib/libpq.so: undefined reference to `SSL_connect@OPENSSL_0.9.8'
/usr/lib/libpq.so: undefined reference to `BIO_new_file@OPENSSL_0.9.8'
collect2: ld returned 1 exit status
checked program was:
/* begin */
1: #include "ruby.h"
2: 
3: #include <libpq-fe.h>
4: 
5: /*top*/
6: int main() {return 0;}
7: int t() { void ((*volatile p)()); p = (void ((*)()))PQconnectdb; return 0; }
/* end */

"gcc -o conftest -I/usr/local/rvm/rubies/ruby-1.9.3-p0/include/ruby-1.9.1/i686-linux -I/usr/local/rvm/rubies/ruby-1.9.3-p0/include/ruby-1.9.1/ruby/backward -I/usr/local/rvm/rubies/ruby-1.9.3-p0/include/ruby-1.9.1 -I. -I/usr/local/rvm/usr/include  -D_FILE_OFFSET_BITS=64  -I/usr/include/postgresql  -O3 -ggdb -Wextra -Wno-unused-parameter -Wno-parentheses -Wno-long-long -Wno-missing-field-initializers -Wpointer-arith -Wwrite-strings -Wdeclaration-after-statement -Wimplicit-function-declaration  -fPIC conftest.c  -L. -L/usr/local/rvm/rubies/ruby-1.9.3-p0/lib -Wl,-R/usr/local/rvm/rubies/ruby-1.9.3-p0/lib -L/usr/local/rvm/usr/lib -Wl,-R/usr/local/rvm/usr/lib -L.  -rdynamic -Wl,-export-dynamic -L/usr/lib     -Wl,-R -Wl,/usr/local/rvm/rubies/ruby-1.9.3-p0/lib -L/usr/local/rvm/rubies/ruby-1.9.3-p0/lib -lruby -lpq  -lpthread -lrt -ldl -lcrypt -lm   -lc"
conftest.c: In function 't':
conftest.c:7: error: too few arguments to function 'PQconnectdb'
checked program was:
/* begin */
1: #include "ruby.h"
2: 
3: #include <libpq-fe.h>
4: 
5: /*top*/
6: int main() {return 0;}
7: int t() { PQconnectdb(); return 0; }
/* end */

--------------------

have_library: checking for PQconnectdb() in -llibpq... -------------------- no

"gcc -o conftest -I/usr/local/rvm/rubies/ruby-1.9.3-p0/include/ruby-1.9.1/i686-linux -I/usr/local/rvm/rubies/ruby-1.9.3-p0/include/ruby-1.9.1/ruby/backward -I/usr/local/rvm/rubies/ruby-1.9.3-p0/include/ruby-1.9.1 -I. -I/usr/local/rvm/usr/include  -D_FILE_OFFSET_BITS=64  -I/usr/include/postgresql  -O3 -ggdb -Wextra -Wno-unused-parameter -Wno-parentheses -Wno-long-long -Wno-missing-field-initializers -Wpointer-arith -Wwrite-strings -Wdeclaration-after-statement -Wimplicit-function-declaration  -fPIC conftest.c  -L. -L/usr/local/rvm/rubies/ruby-1.9.3-p0/lib -Wl,-R/usr/local/rvm/rubies/ruby-1.9.3-p0/lib -L/usr/local/rvm/usr/lib -Wl,-R/usr/local/rvm/usr/lib -L.  -rdynamic -Wl,-export-dynamic -L/usr/lib     -Wl,-R -Wl,/usr/local/rvm/rubies/ruby-1.9.3-p0/lib -L/usr/local/rvm/rubies/ruby-1.9.3-p0/lib -lruby -llibpq  -lpthread -lrt -ldl -lcrypt -lm   -lc"
/usr/bin/ld: cannot find -llibpq
collect2: ld returned 1 exit status
checked program was:
/* begin */
1: #include "ruby.h"
2: 
3: #include <libpq-fe.h>
4: 
5: /*top*/
6: int main() {return 0;}
7: int t() { void ((*volatile p)()); p = (void ((*)()))PQconnectdb; return 0; }
/* end */

"gcc -o conftest -I/usr/local/rvm/rubies/ruby-1.9.3-p0/include/ruby-1.9.1/i686-linux -I/usr/local/rvm/rubies/ruby-1.9.3-p0/include/ruby-1.9.1/ruby/backward -I/usr/local/rvm/rubies/ruby-1.9.3-p0/include/ruby-1.9.1 -I. -I/usr/local/rvm/usr/include  -D_FILE_OFFSET_BITS=64  -I/usr/include/postgresql  -O3 -ggdb -Wextra -Wno-unused-parameter -Wno-parentheses -Wno-long-long -Wno-missing-field-initializers -Wpointer-arith -Wwrite-strings -Wdeclaration-after-statement -Wimplicit-function-declaration  -fPIC conftest.c  -L. -L/usr/local/rvm/rubies/ruby-1.9.3-p0/lib -Wl,-R/usr/local/rvm/rubies/ruby-1.9.3-p0/lib -L/usr/local/rvm/usr/lib -Wl,-R/usr/local/rvm/usr/lib -L.  -rdynamic -Wl,-export-dynamic -L/usr/lib     -Wl,-R -Wl,/usr/local/rvm/rubies/ruby-1.9.3-p0/lib -L/usr/local/rvm/rubies/ruby-1.9.3-p0/lib -lruby -llibpq  -lpthread -lrt -ldl -lcrypt -lm   -lc"
conftest.c: In function 't':
conftest.c:7: error: too few arguments to function 'PQconnectdb'
checked program was:
/* begin */
1: #include "ruby.h"
2: 
3: #include <libpq-fe.h>
4: 
5: /*top*/
6: int main() {return 0;}
7: int t() { PQconnectdb(); return 0; }
/* end */

--------------------

have_library: checking for PQconnectdb() in -lms/libpq... -------------------- no

"gcc -o conftest -I/usr/local/rvm/rubies/ruby-1.9.3-p0/include/ruby-1.9.1/i686-linux -I/usr/local/rvm/rubies/ruby-1.9.3-p0/include/ruby-1.9.1/ruby/backward -I/usr/local/rvm/rubies/ruby-1.9.3-p0/include/ruby-1.9.1 -I. -I/usr/local/rvm/usr/include  -D_FILE_OFFSET_BITS=64  -I/usr/include/postgresql  -O3 -ggdb -Wextra -Wno-unused-parameter -Wno-parentheses -Wno-long-long -Wno-missing-field-initializers -Wpointer-arith -Wwrite-strings -Wdeclaration-after-statement -Wimplicit-function-declaration  -fPIC conftest.c  -L. -L/usr/local/rvm/rubies/ruby-1.9.3-p0/lib -Wl,-R/usr/local/rvm/rubies/ruby-1.9.3-p0/lib -L/usr/local/rvm/usr/lib -Wl,-R/usr/local/rvm/usr/lib -L.  -rdynamic -Wl,-export-dynamic -L/usr/lib     -Wl,-R -Wl,/usr/local/rvm/rubies/ruby-1.9.3-p0/lib -L/usr/local/rvm/rubies/ruby-1.9.3-p0/lib -lruby -lms/libpq  -lpthread -lrt -ldl -lcrypt -lm   -lc"
/usr/bin/ld: cannot find -lms/libpq
collect2: ld returned 1 exit status
checked program was:
/* begin */
1: #include "ruby.h"
2: 
3: #include <libpq-fe.h>
4: 
5: /*top*/
6: int main() {return 0;}
7: int t() { void ((*volatile p)()); p = (void ((*)()))PQconnectdb; return 0; }
/* end */

"gcc -o conftest -I/usr/local/rvm/rubies/ruby-1.9.3-p0/include/ruby-1.9.1/i686-linux -I/usr/local/rvm/rubies/ruby-1.9.3-p0/include/ruby-1.9.1/ruby/backward -I/usr/local/rvm/rubies/ruby-1.9.3-p0/include/ruby-1.9.1 -I. -I/usr/local/rvm/usr/include  -D_FILE_OFFSET_BITS=64  -I/usr/include/postgresql  -O3 -ggdb -Wextra -Wno-unused-parameter -Wno-parentheses -Wno-long-long -Wno-missing-field-initializers -Wpointer-arith -Wwrite-strings -Wdeclaration-after-statement -Wimplicit-function-declaration  -fPIC conftest.c  -L. -L/usr/local/rvm/rubies/ruby-1.9.3-p0/lib -Wl,-R/usr/local/rvm/rubies/ruby-1.9.3-p0/lib -L/usr/local/rvm/usr/lib -Wl,-R/usr/local/rvm/usr/lib -L.  -rdynamic -Wl,-export-dynamic -L/usr/lib     -Wl,-R -Wl,/usr/local/rvm/rubies/ruby-1.9.3-p0/lib -L/usr/local/rvm/rubies/ruby-1.9.3-p0/lib -lruby -lms/libpq  -lpthread -lrt -ldl -lcrypt -lm   -lc"
conftest.c: In function 't':
conftest.c:7: error: too few arguments to function 'PQconnectdb'
checked program was:
/* begin */
1: #include "ruby.h"
2: 
3: #include <libpq-fe.h>
4: 
5: /*top*/
6: int main() {return 0;}
7: int t() { PQconnectdb(); return 0; }
/* end */

--------------------

【问题讨论】:

    标签: ruby postgresql ubuntu pg ruby-1.9.3


    【解决方案1】:

    在我的情况下,我遇到了同样的问题,lib 在 .rvm/usr/lib 中被带到了这个编译中,而不是来自系统的 lib。我不确定为什么会发生这种情况以及为什么它不起作用(在我的情况下是在 Ubuntu 10.04 x86_64 上),但只是解决它:

     mv ~/.rvm/usr/lib ~/.rvm/usr/lib_rvm
    

    暂时或永远;)

    如果有人会调查为什么会发生这种情况,我将不胜感激。 问候。

    【讨论】:

    • 多谢多谢多谢,在google了几天终于解决了这个问题!!
    • 吃我身边的巧克力蛋糕 :) 花了一天时间安装 pg gem。
    • 这是否记录在任何地方的错误报告中?我想投票,因为这是第三次发生在我身上......
    • 从我可以从这个 (groups.google.com/forum/#!msg/ruby-pg/oCo8hDHR16A/0y3KdxrPNSMJ) 和 Michael Granger 在错误报告中的 cmets 中收集到的信息,对于许多遇到此问题的人来说,根本问题是 ruby​​ 可执行文件与一个版本的OpenSSL,而 PostgreSQL 客户端库链接到另一个版本。一起使用这两个版本是自找麻烦(段错误?)。如果这是正确的,那么 pg gem 将是“错误的”,无论它链接到哪个,前进的方法是重新编译 PostgreSQL 或 Ruby,以便它们使用相同的 OpenSSL 库。
    • 你说得对,@antinome。针对与您的 libpq 不同版本的 OpenSSL 编译 pg 将导致此问题。 RVM 安装了自己的 OpenSSL 私有副本(我假设是因为它是较新的副本或其他东西),这就是为什么将 ~/.rvm/usr/lib 移到一边“解决”问题的原因。但是,如果您这样做,请记住您的“openssl”Ruby 库可能会出现段错误或无法加载,这是许多其他库的依赖项(我想到了 net/http)。如果将其移回原处,则可能会出现来自“pg”“openssl”的段错误,具体取决于首先加载的 libssl 版本。
    【解决方案2】:

    查看第 39 行附近的 mkmf.log

    "gcc -o conftest -I/usr/local/rvm/rubies/ruby-1.9.3-p0/include/ruby-1.9.1/i686-linux -I/usr/local/rvm/rubies/ruby-1.9.3-p0/include/ruby-1.9.1/ruby/backward -I/usr/local/rvm/rubies/ruby-1.9.3-p0/include/ruby-1.9.1 -I. -I/usr/local/rvm/usr/include  -D_FILE_OFFSET_BITS=64  -I/usr/include/postgresql  -O3 -ggdb -Wextra -Wno-unused-parameter -Wno-parentheses -Wno-long-long -Wno-missing-field-initializers -Wpointer-arith -Wwrite-strings -Wdeclaration-after-statement -Wimplicit-function-declaration  -fPIC conftest.c  -L. -L/usr/local/rvm/rubies/ruby-1.9.3-p0/lib -Wl,-R/usr/local/rvm/rubies/ruby-1.9.3-p0/lib -L/usr/local/rvm/usr/lib -Wl,-R/usr/local/rvm/usr/lib -L.  -rdynamic -Wl,-export-dynamic -L/usr/lib     -Wl,-R -Wl,/usr/local/rvm/rubies/ruby-1.9.3-p0/lib -L/usr/local/rvm/rubies/ruby-1.9.3-p0/lib -lruby -lpq  -lpthread -lrt -ldl -lcrypt -lm   -lc"
    /usr/lib/libpq.so: undefined reference to `X509_STORE_set_flags@OPENSSL_0.9.8'
    /usr/lib/libpq.so: undefined reference to `CRYPTO_set_locking_callback@OPENSSL_0.9.8'
    /usr/lib/libpq.so: undefined reference to `ENGINE_init@OPENSSL_0.9.8'
    /usr/lib/libpq.so: undefined reference to `ENGINE_free@OPENSSL_0.9.8'
    /usr/lib/libpq.so: undefined reference to `ENGINE_load_private_key@OPENSSL_0.9.8'
    ...
    

    闻起来像缺少 OpenSSL。我也没有在库列表中看到-lssl,但缺少的符号表明它应该在那里。

    所以尝试安装 OpenSSL 库(从外观上看是 0.9.8 版)。然后查看pg_config --libs 是否包含-lssl 或类似内容,然后重试。如果所有这些都有效,那么您可能需要向 Ubuntu 人员发送错误报告,以便他们可以修复 libpq-dev 依赖项。

    抱歉,我目前没有任何可访问的 Ubuntu 设置,所以这里有一些猜测。

    【讨论】:

    • 感谢您的帮助。不幸的是,安装了 OpenSSL(和所有开发头文件)。 pg_config --libs 的输出是-lpgport -lxslt -lxml2 -lpam -lssl -lcrypto -lkrb5 -lcom_err -lgssapi_krb5 -lz -lreadline -lcrypt -ldl -lm;所以它确实有 -lssl,而且似乎没有其他任何东西丢失。
    • ldd /usr/lib/libpq.so 输出什么?它应该告诉你它链接到哪个 openssl 库。
    • 我把它添加到了要点中,这里:gist.github.com/d05a81701d968895c730#file_ldd.stdout
    • @Sam:配置脚本没有使用pg_config --libs 来获取必要的库,知道为什么不这样做吗?
    • 恐怕不行;我不认为这是应该的。是否有一个开关可以覆盖它们(所以我可以做类似--with-pgsql-libs="$(pg_config --libs)" 的事情)?我没有看到,但你永远不知道。
    【解决方案3】:

    不要被正在安装的 SSL 库所迷惑 - 查看您的 Ruby 构建并检查那里的 ssl 构建日志。我以前也被那个咬过。有时无法加载的其他库是 GZip 库。这可能不是问题,但请看一下。

    更新:

    您需要 -dev 库。

    这些天来,我使用 rbenv 或其他 ruby​​ 构建工具之一,并关注他们吐出的任何消息。

    【讨论】:

    • Ghoti:我没有看到任何有趣的东西(在重建 1.9.3 或构建 1.8.7 和 1.9.2 时会发生同样的错误,这很奇怪在 1.9.2 之前工作正常)。但我会继续挖掘日志,如果我找到任何东西,请告诉你。感谢您的帮助!
    猜你喜欢
    • 2021-07-11
    • 2012-03-03
    • 2012-10-16
    • 2015-01-30
    • 2015-04-23
    • 2014-09-14
    • 1970-01-01
    • 2015-05-03
    • 2011-08-27
    相关资源
    最近更新 更多