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
仅安装了动态版本。)
答案 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已指定的目录中的正确文件位置。