Ruby' pg' gem链接到libpq.5.dylib的错误副本(在OSX上)

时间:2014-07-08 08:48:23

标签: ruby macos postgresql gem

PostgreSQL 9.3的EnterpriseDB安装程序将其文件放在Mac OSX上的/Library/PostgreSQL/9.3/*中。但是,Ruby gem“pg”从libpq.5.dylib加载“C”动态库/usr/lib的旧版本,而不是使用/Library/PostgreSQL/9.3/lib中的正确版本。尽管我已经用

安装了宝石,但仍会发生这种情况
gem install pg -- --with-pg-config=/Library/PostgreSQL/9.3/bin/pg_config

在确定需要'pg'gem之前,我通过设置DYLD_PRINT_LIBRARIES环境变量来确定加载了libpq.5.dylib的哪个版本。

链接到错误的动态库的最明显后果是gem无法使用域套接字连接到数据库,因为套接字在/var/pgsql_socket/tmp的版本之间重新定位。但是,链接到旧库也可能会导致其他问题。

有关如何解决此问题的任何建议?

(我正在运行Mac OSX Lion。附加说明:对于大多数pg库,EnterpriseDB安装程序在/Library/PostgreSQL/9.3/lib中都放置了静态(.a)和动态(.dylib)版本,但对于libpq.5仅安装了动态版本。)

1 个答案:

答案 0 :(得分:3)

当我在命令行运行bin/pg_config时,问题的原因和简单的解决方案都变得明显。

pg_config生成用于控制编译和链接的变量。特别感兴趣的是LIBDIR和LDFLAGS。 LIBDIR指定静态库的位置,而LDFLAGS提供搜索动态库的位置。在我的系统上,LIBDIR被正确设置为/LibraryPostgreSQL/9.3/lib,但LDFLAGS设置如下:

LDFLAGS = -L../../../src/common -L/usr/local/lib -L/opt/local/20140109/lib -Wl,-dead-strip-dylibs

由于libpq.5.dylib在任何这些位置都不存在,因此gem无法找到它,而是找到了恰好安装在/usr/lib的旧版本。

解决此问题的一种方法是将正确的文件位置注入LDFLAGS,可能是通过修改生成配置文件的extconf.rb中的代码。但是,在这种情况下更容易解决的问题就是将/usr/local/lib中的符号链接添加到正确的文件位置:

/usr/local/lib> ln -s /Library/PostgreSQL/9.3/lib/libpq.5.dylib libpq.5.dylib

如果遇到类似的问题,只需检查pg_config的输出,看看是否可以将符号链接放在LDFLAGS已指定的目录中的正确文件位置。