ARM64 架构(M1 芯片):无法安装 pg gem(使用 PostgresApp)

25

我一直在尝试在我的电脑上(Macbook Pro 2020 with M1)安装一个rails项目,运行的是Big Sur操作系统。

我已经安装了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 */

有什么想法可以解决这个问题吗?

2
你需要使用Postgres.app吗?我也遇到了同样的问题。我删除了它,改用Homebrew版本的postgres。效果很好。 - Ingmaras Keleras
@IngmarasKeleras 是的,在 MacOS 上本地版本存在一些排序问题。 - Tiago
3个回答

86

对于那些只想安装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

1
这应该是被接受的答案。 - Matt
1
这对我有用!同意它应该是被采纳的答案。 - Tom Pinchen
2
谢谢!在我的 M1 Pro 上运行良好。 - Gonzalo De-Spirito
这不是最优选择,因为它跳过了Postgres.app,但是回到x86 homebrew对我来说似乎是疯狂的。我认为自己做这件事时会遇到其他许多兼容性问题。但我可能是错的。无论如何,这种做法感觉非常极端。 - Mig
1
天才。 - mendespedro
这非常有帮助,但是homebrew最近已经改变了postgresql的安装方式,使用明确的版本标签,因此使用brew安装libpq没有帮助-它不知道我的“真正”postgresql安装位置在哪里。我必须找到我的真正的pg_config文件并将路径添加到那里:export PATH="/opt/homebrew/opt/postgresql@14/bin:$PATH"。然后我必须在我的Gemfile中指定pg版本1.4.3,并进行bundle install。 - chetstone

11
我在M1上使用ruby的pg gem也遇到了同样的问题。问题出现在我系统中混合了ARM和x86二进制文件,而pg显然只能用x86编译。另外,该项目在github上报告了新问题,希望很快能得到解决(点击这里查看)。
我的解决办法是:
0.卸载基于ARM的homebrew + rbenv,并从您的主目录中删除.gem和.rbenv目录(参见homebrew卸载说明
1.以x86英特尔为基础重新安装homebrew
$ arch -x86_64 /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"
  1. 安装 x86 架构的 rbenv(或其他你喜欢的 Ruby 版本管理器)
$ arch -x86_64 brew install rbenv
$ arch -x86_64 rbenv install 2.7.2

3a) (选填)对于 postgres.app,您可以预先配置 pg-config 的位置,以便在出现故障时不必运行手动 gem 安装。例如:

$ bundle config build.pg --with-pg-config=/Applications/Postgres.app/Contents/Versions/latest/bin/pg_config

3b)(可选)对于brew,您可以执行相同的操作:

$ bundle config build.pg --with-pg-config=$(brew --prefix)/opt/libpq/bin/pg_config
  1. 重新打包你的项目,然后尽情享受 Rosetta 2 上的 Ruby(目前只能如此)。
$ bundle install
$ rails s

1
我最终安装了本地的Postgres数据库(因为不想在性能问题上让Ruby运行“模拟”)。我会等到Postgres.app发布ARM64版本再考虑。 - Tiago
@Tiago,我问了一个关于这个问题的问题,希望不必使用homebrew安装postgres。我想我会做同样的事情。我的当前实例在一台10年前的High Sierra电脑上,所以我想将它迁移到我的M1电脑上。 - Pamela Cook - LightBe Corp
4
Postgres.app现已发布beta版arm版本,可在此处获取:https://github.com/PostgresApp/PostgresApp/releases/tag/v2.5beta1,pg gem现在可以与其一起安装! - mauro_oto

5

我在使用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宝石

 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-06

使用Ruby 2.6成功安装了pg。

  1. 首先安装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 

谢谢您,我一直在寻找解决方案,而是通过“brew install PostgreSQL”才能让我成功运行“gem install pg”,没有出现错误。 - AngeloS

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接