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

PostgreSQL 9.3的EnterpriseDB安装程序将其文件放在Mac OSX上的/Library/PostgreSQL/9.3/* 。 但是,Ruby libpq.5.dylib ‘从/usr/lib加载旧版本的’C’动态库libpq.5.dylib ,而不是使用/Library/PostgreSQL/9.3/lib的正确版本。 尽管我已安装了gem,但仍会发生这种情况

 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只安装了动态版本。)

当我在命令行运行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已指定的目录之一中的正确文件位置。