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已指定的目录之一中的正确文件位置。