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

时间:2021-01-20 13:11:18

标签: ruby-on-rails rubygems pg apple-silicon postgresapp

我一直在尝试在运行 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 */

知道如何解决这个问题吗?

1 个答案:

答案 0 :(得分:1)

我在使用 M1 + ruby​​ pg gem 时遇到了同样的问题。问题是我的系统上混合了 ARM + x86 二进制文件,而 pg 显然目前只能用 x86 编译。仅供参考,在其 github 存储库中报告了新问题,因此希望它会很快得到解决 here

我的工作:

  1. 卸载基于 ARM 的 homebrew + rbenv 并从主目录 (homebrew uninstall instructions) 中删除 .gem + .rbenv 目录

  2. 将 homebrew 重新安装为基于 x86 的英特尔

$ arch -x86_64 /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"
  1. 将 rbenv 安装为 x86(或任何您喜欢的 ruby​​ 版本管理器)
$ arch -x86_64 brew install rbenv
$ arch -x86_64 rbenv install 2.7.2
  1. (可选)对于 postgres.app,您可以预先配置 pg-config 所在的位置,这样您就不必在它阻塞时运行手动 gem install。例如
$ bundle config build.pg- --with-pg-config=/Applications/Postgres.app/Contents/Versions/latest/bin/pg_config
  1. 重新打包您的项目并在 rosetta 2 上使用 ruby​​(暂时)
$ bundle install
$ rails s