在 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
这似乎类似于dyld:惰性符号绑定失败:未找到符号:_PQresultMemorySize - Rails,
但是该怎么办?
我以前的 Rails 应用程序,在 Rails v6.0.1 上,也使用相同的 postgres
gem 'pg', '>= 0.18', '< 2.0'
运行得很好
解决我的问题的是运行
gem uninstall pg
,然后执行 bundle install
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(并且具有更正确的扩展名)或者只是一个尚未尝试访问此新功能的版本)。
好的,团队 — 这就是我所做的。
首先,我在通过自制程序从
postgresql
12 升级到 13 时遇到了这个问题……因为我是个白痴,没有固定 12。
修复了一堆问题后,一切似乎都正常运行(我可以启动我的服务器,我可以重新安装
pg
gem - 一切似乎都很好)。我很早就在重新安装 /usr/lib/libpq.5.dylib
时遇到了 pg
错误……但后来它神奇地消失了,我以为我是金子。我不是。当我运行 Rails 控制台时,我运行了一个查询并......得到了 /usr/lib/libpq.5.dylib
错误。
所做的工作是:
brew services stop postgresql
brew install libpq
brew link --overwrite libpq --force
brew services start postgresql
对于那些正在跑步的人
spring
,不要忘记spring stop
(我不确定顺序是否真的重要,也可以停止/重新启动postgresql
,这不是必要的,但安全总比后悔好) .
重建宝石对我有用:
gem pristine pg
我找到了以下解决方法。它硬编码了 pg_ext.bundle 中共享库的路径:
install_name_tool -change libpq.5.dylib /Library/PostgreSQL/12/lib/libpq.5.12.dylib pg_ext.bundle
下次尝试解决方案:
$ 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?
我遇到了同样的问题,解决此问题的步骤是:
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
brew install postgresql
或
gem install pg -v '1.2.3' --source 'https://rubygems.org/
rails db:setup
您可能需要找到您想要连接的 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