ARM64架构(M1芯片):无法安装pg gem(使用PostgresApp)
Posted
技术标签:
【中文标题】ARM64架构(M1芯片):无法安装pg gem(使用PostgresApp)【英文标题】:ARM64 architecture (M1 chip): Cannot install pg gem (using PostgresApp) 【发布时间】:2021-04-24 20:35:50 【问题描述】:我一直在尝试在运行 Big Sur 的计算机(带有 M1 的 Macbook Pro 2020)上安装一个 rails 项目。
我已经安装了 PostgresApp。
运行bundle install
时,它无法构建pg
gem,所以我尝试手动安装gem(通过执行gem install pg
- 也尝试使用gem install pg -- --with-pg-config=/Applications/Postgres.app/Contents/Versions/10/bin/pg_config
)。
我收到一条错误消息:
ERROR: Error installing pg:
ERROR: Failed to build gem native extension.
Can't find the PostgreSQL client library (libpq)
*** extconf.rb failed ***
检查错误日志时,我看到:
have_library: checking for PQconnectdb() in -lpq... -------------------- no
ld: warning: ignoring file /Applications/Postgres.app/Contents/Versions/13/lib/libpq.dylib, building for macOS-arm64 but attempting to link with file built for macOS-x86_64
Undefined symbols for architecture arm64:
"_PQconnectdb", referenced from:
_t in conftest-db479f.o
ld: symbol(s) not found for architecture arm64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
checked program was:
/* begin */
1: #include "ruby.h"
2:
3: #include <libpq-fe.h>
4:
5: /*top*/
6: extern int t(void);
7: int main(int argc, char **argv)
8:
9: if (argc > 1000000)
10: printf("%p", &t);
11:
12:
13: return 0;
14:
15: int t(void) void ((*volatile p)()); p = (void ((*)()))PQconnectdb; return !p;
/* end */
知道如何解决这个问题吗?
【问题讨论】:
你需要使用 Postgres.app 吗?我遇到了同样的问题。我删除了它并使用了 postgres 的自制版本。效果很好。 @IngmarasKeleras 是的,原生版本在 MacOS 中存在一些排序问题。 【参考方案1】:对于那些只是尝试安装 pg gem 并且不关心 PostgresApp 的人,在 M1 上修复 pg 的关键是确保 libpq
的存在。这些步骤允许我在我的 M1 mac 上安装 pg gem,而无需使用 x86 版本或构建标志:
brew install libpq
export PATH="/opt/homebrew/opt/libpq/bin:$PATH"
gem install pg
【讨论】:
这应该是公认的答案。 这对我有用!同意这应该是公认的答案。【参考方案2】:在 brew PostgreSQL 上遇到了同样的问题,但是我在 macOS M1(12 Monterey) 上使用 Ruby 2.7 成功安装了 pg gem,我同时安装了 x86 和 arm64 brew。由于pg必须用x86 libpq编译,所以我用x86 brew安装了libpq
❯ which brow
brow: aliased to arch --x86_64 /usr/local/Homebrew/bin/brew
❯ brow install libpq
❯ brew install PostgreSQL # Install arm64 PostgreSQL
❯ brew services start postgresql
❯ ps -ef | grep postgresql
501 23655 1 0 2:29PM ?? 0:00.10 /opt/homebrew/opt/postgresql/bin/postgres -D /opt/homebrew/var/postgres
❯ which brew
/opt/homebrew/bin/brew
❯ brew -v
Homebrew 3.3.2-50-geca16a2
Homebrew/homebrew-core (git revision ec99d74792c; last commit 2021-11-05)
Homebrew/homebrew-cask (git revision 2ab51af9c3; last commit 2021-11-05)
然后我可以安装 pg gem
❯ ruby -v
ruby 2.7.1p83 (2020-03-31 revision a0c7c23c9c) [x86_64-darwin19]
❯ gem install pg -v 1.2.3 -- --with-pq-dir=/usr/local/Cellar/libpq/13.3
Building native extensions with: '--with-pq-dir=/usr/local/Cellar/libpq/13.3'
This could take a while...
Successfully installed pg-1.2.3
Parsing documentation for pg-1.2.3
Done installing documentation for pg after 0 seconds
但是 Ruby 2.6 失败了,我不知道为什么
gem install pg -v 1.2.3 -- --with-pq-dir=/usr/local/Cellar/libpq/13.3
Building native extensions with: '--with-pq-dir=/usr/local/Cellar/libpq/13.3'
This could take a while...
ERROR: Error installing pg:
ERROR: Failed to build gem native extension.
current directory: /Users/felix/.rvm/gems/ruby-2.6.6/gems/pg-1.2.3/ext
/Users/felix/.rvm/rubies/ruby-2.6.6/bin/ruby -I /Users/felix/.rvm/rubies/ruby-2.6.6/lib/ruby/site_ruby/2.6.0 -r ./siteconf20211105-41969-1oxcuyy.rb extconf.rb --with-pq-dir\=/usr/local/Cellar/libpq/13.3
checking for pg_config... yes
Using config values from /opt/homebrew/bin/pg_config
checking for libpq-fe.h... yes
checking for libpq/libpq-fs.h... yes
checking for pg_config_manual.h... yes
checking for PQconnectdb() in -lpq... no
checking for PQconnectdb() in -llibpq... no
checking for PQconnectdb() in -lms/libpq... no
Can't find the PostgreSQL client library (libpq)
2021 年 11 月 6 日更新
使用 Ruby 2.6 也成功安装了 pg。
-
首先安装 x86 postgresql
# build Postgresql from source, as
# Error: postgresql: no bottle available!
# You can try to install from source with:
# brew install --build-from-source postgresql
brow install --build-from-source postgresql
-
安装带有前缀的pg gem
gem install pg -v 1.2.3 -- --with-pg_config=/usr/local/Cellar/postgresql/13.3/bin/pg_config --with-pq-dir=/usr/local/Cellar/libpq/13.3
【讨论】:
【参考方案3】:我在使用 M1 + ruby pg gem 时遇到了同样的问题。问题是我的系统上混合了 ARM + x86 二进制文件,而 pg
目前显然只能用 x86 编译。仅供参考,在其 github 存储库中报告了新问题,因此希望它会尽快得到解决 here
我的解决方法:
卸载基于 ARM 的 homebrew + rbenv 并从你的主目录中删除你的 .gem
+ .rbenv
目录 (homebrew uninstall instructions)
将自制软件重新安装为基于 x86 英特尔的
$ arch -x86_64 /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"
-
将 rbenv 安装为 x86(或任何您喜欢的 ruby 版本管理器)
$ arch -x86_64 brew install rbenv
$ arch -x86_64 rbenv install 2.7.2
-
(可选)对于 postgres.app,您可以预先配置 pg-config 所在的位置,这样您就不必在它阻塞时运行手动 gem 安装。例如
$ bundle config build.pg- --with-pg-config=/Applications/Postgres.app/Contents/Versions/latest/bin/pg_config
-
重新捆绑您的项目并在 Rosetta 2 上享受 ruby(目前)
$ bundle install
$ rails s
【讨论】:
我最终安装了本机 postgres(不希望 ruby 因性能问题而“模拟”运行)。我会等到 postgres.app 发布 ARM64 版本:) @Tiago 我问了一个关于这个的问题,希望我不必求助于使用自制软件安装 postgres。我想我也会这样做。我当前的实例在一台使用了 10 年的 High Sierra 计算机上,所以我想将它移到我的 M1 计算机上。 Postgres.app 现在发布了一个测试版 arm 版本:github.com/PostgresApp/PostgresApp/releases/tag/v2.5beta1,pg gem 现在安装了!以上是关于ARM64架构(M1芯片):无法安装pg gem(使用PostgresApp)的主要内容,如果未能解决你的问题,请参考以下文章
小知识点:Mac M1/M2 VMware Fusion 安装 Centos 7.9(ARM 64 版本)
在arm架构的mac上安装sql server(m1芯片 or m2芯片)
记录MacOS M1芯片(ARM64架构)使用docker-compose方式部署Kafka
已解决macbook pro m1芯片ubuntu20.04ARM64虚拟机添加输入法