Ruby';pg';gem链接到错误的libpq.5.dylib副本(在OSX上)
EnterpriseDB PostgreSQL 9.3安装程序将其文件放在Mac OSX上的Ruby';pg';gem链接到错误的libpq.5.dylib副本(在OSX上),ruby,macos,postgresql,gem,Ruby,Macos,Postgresql,Gem,EnterpriseDB PostgreSQL 9.3安装程序将其文件放在Mac OSX上的/Library/PostgreSQL/9.3/*中。但是,Ruby gem“pg”从/usr/lib加载“C”动态库libpq.5.dylib的旧版本,而不是使用/library/PostgreSQL/9.3/lib的正确版本。尽管我已使用安装了gem,但仍会发生这种情况 gem install pg -- --with-pg-config=/Library/PostgreSQL/9.3/bin/pg_
/Library/PostgreSQL/9.3/*
中。但是,Ruby gem“pg”从/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已指定的某个目录中的正确文件位置。works中建议的解决方法;即将环境变量DYLD_LIBRARY_PATH设置为/LIBRARY/PostgreSQL/9.3/lib。然而,我希望有一个更吸引人的解决方案。肖恩对的回答对理解这个问题非常有用,也可能对其他人感兴趣。非常有帮助……我可能最终会发现这一点,但我不会在这上面下太多赌注……我已经扫描了我的pg_配置的输出,没有发现问题。非常感谢。