【问题标题】:Ruby 'pg' gem linking to wrong copy of libpq.5.dylib (on OSX)Ruby 'pg' gem 链接到 libpq.5.dylib 的错误副本(在 OSX 上)
【发布时间】:2014-08-28 22:21:19
【问题描述】:

PostgreSQL 9.3 的 EnterpriseDB 安装程序将其文件放在 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_config

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

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

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

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

【问题讨论】:

标签: ruby macos postgresql gem


【解决方案1】:

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

【讨论】:

  • 肖恩对this post 的回答对于理解问题非常有用,其他人可能也会感兴趣。
  • 超级有用...我可能已经最终想通了,但我不会在上面赌一大笔钱...我已经扫描了我的 pg_config 的输出并且没有发现问题。谢谢!!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-13
  • 2011-08-11
  • 2012-02-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多