Rails、Postgres:dyld:惰性符号绑定失败:找不到符号:_PQresultMemorySize

问题描述 投票:0回答:8

在 Mac 上使用 postgres 创建一个新的 Rails-app (6.0.2),无法让它运行。

应用程序启动时出现此错误:

dyld: Symbol not found: _PQresultMemorySize
  Referenced from: /Users/dev/.rvm/gems/ruby-2.5.7/gems/pg-1.2.2/lib/pg_ext.bundle
  Expected in: /usr/lib/libpq.5.dylib

enter image description here

这似乎类似于dyld:惰性符号绑定失败:未找到符号:_PQresultMemorySize - Rails

但是该怎么办?

我以前的 Rails 应用程序,在 Rails v6.0.1 上,也使用相同的 postgres

gem 'pg', '>= 0.18', '< 2.0'
运行得很好

ruby-on-rails postgresql macos
8个回答
28
投票

解决我的问题的是运行

gem uninstall pg
,然后执行
bundle install


6
投票

PQresultMemorySize
是在 postgres 12 中引入的,从 1.2.0 开始
pg
gem 在扩展构建期间检查它是否可用,如果可用则使用(以前不可用)。由于它在构建时可用,并且您可能没有立即降级 postgres 或 libpq - 这表明存在一些版本冲突。

从自制程序安装时,位置将是

/usr/local/lib/libpq.5.dylib
,但你有
/usr/lib/libpq.5.dylib
看起来您已经将来自/和 postgres >= 12 的 libpq 与某些旧版本一起安装了。

您需要找到安装了哪些不同的 postgresses/libpq 并删除其中之一以消除冲突。

作为临时解决方案 - 您可以将

pg
版本要求设置为与您已经工作的版本完全相同(查看其他应用程序的 Gemfile.lock),以便使用已安装的 gem(并且具有更正确的扩展名)或者只是一个尚未尝试访问此新功能的版本)。


5
投票

好的,团队 — 这就是我所做的。

首先,我在通过自制程序从

postgresql
12 升级到 13 时遇到了这个问题……因为我是个白痴,没有固定 12。

修复了一堆问题后,一切似乎都正常运行(我可以启动我的服务器,我可以重新安装

pg
gem - 一切似乎都很好)。我很早就在重新安装
/usr/lib/libpq.5.dylib
时遇到了
pg
错误……但后来它神奇地消失了,我以为我是金子。我不是。当我运行 Rails 控制台时,我运行了一个查询并......得到了
/usr/lib/libpq.5.dylib
错误。

所做的工作是:

  1. brew services stop postgresql
  2. brew install libpq
  3. brew link --overwrite libpq --force
  4. brew services start postgresql

对于那些正在跑步的人

spring
,不要忘记
spring stop
(我不确定顺序是否真的重要,也可以停止/重新启动
postgresql
,这不是必要的,但安全总比后悔好) .


3
投票

重建宝石对我有用:

gem pristine pg

2
投票

我找到了以下解决方法。它硬编码了 pg_ext.bundle 中共享库的路径:

install_name_tool -change libpq.5.dylib /Library/PostgreSQL/12/lib/libpq.5.12.dylib pg_ext.bundle

2
投票

下次尝试解决方案:

$ gem install pg -- --with-pg-config=/Library/PostgreSQL/12/bin/pg_config
根据github-pg

Fetching: pg-1.2.2.gem (100%)
Building native extensions with: '--with-pg-config=/Library/PostgreSQL/12/bin/pg_config'
This could take a while...
Successfully installed pg-1.2.2
Parsing documentation for pg-1.2.2
Installing ri documentation for pg-1.2.2
Done installing documentation for pg after 0 seconds
1 gem installed

宝石文件:

gem 'pg', '~> 1.2.2'

同样的结果

pg搜索

/usr/lib/libpq.5.dylib
,有一个符号链接,但它似乎指向旧版本的postgres。

对我来说,它似乎应该寻找

/Library/PostgreSQL/12/lib/libpq.5.dylib

如何教宝石寻找那个dylib?


1
投票

我遇到了同样的问题,解决此问题的步骤是:

  1. gem uninstall pg - 您可能会收到一条消息:
pg is not installed in GEM_HOME, try:
    gem uninstall -i /Users/user_name/.rvm/rubies/ruby-2.7.1/lib/ruby/gems/2.7.0 pg

如果发生这种情况,请使用 sudo 执行建议的路径:

sudo gem uninstall -i /Users/user_name/.rvm/rubies/ruby-2.7.1/lib/ruby/gems/2.7.0 pg
  1. 如果运行 bundle install 可能会导致错误“安装 pg (1.2.3) 时发生错误,并且 Bundler 无法继续。”。安装postgres:
brew install postgresql

gem install pg -v '1.2.3' --source 'https://rubygems.org/
  1. 继续使用rails命令,就像我的例子一样:
rails db:setup

0
投票

您可能需要找到您想要连接的 postgres 版本的 pg_config 文件所在的位置。尝试

sudo find / -name "*pg_config"
。您应该找到类似
/usr/local/Cellar/postgresql@14/14.13/bin/pg_config
的条目(我使用
brew
安装了 postgres)。

如果您的应用程序已安装

pg
,请将其删除。确保同时删除
pg
gems 中的
vendor
文件夹。

运行以下命令

> gem install pg -- --with-pg-config=<config-path-your-found>
> bundle install
© www.soinside.com 2019 - 2024. All rights reserved.