找不到 PostgreSQL 客户端库(libpq)

我正在尝试在 Mac OS X 10.6上安装 PostgreSQL for Rails。首先,我尝试了 MacPorts 安装,但进展不顺利,所以我做了一键 DMG 安装。看起来挺管用的。

我怀疑我需要安装 PostgreSQL 开发包,但是我不知道如何在 OS X 上安装。

下面是我尝试做 sudo gem install pg时得到的结果:

$ sudo gem install pg
Building native extensions.  This could take a while...
ERROR:  Error installing pg:
ERROR: Failed to build gem native extension.


/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/bin/ruby extconf.rb
checking for pg_config... yes
Using config values from /Library/PostgreSQL/8.3/bin/pg_config
checking for libpq-fe.h... yes
checking for libpq/libpq-fs.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)
*** extconf.rb failed ***
Could not create Makefile due to some reason, probably lack of
necessary libraries and/or headers.  Check the mkmf.log file for more
details.  You may need configuration options.


Provided configuration options:
--with-opt-dir
--without-opt-dir
--with-opt-include
--without-opt-include=${opt-dir}/include
--with-opt-lib
--without-opt-lib=${opt-dir}/lib
--with-make-prog
--without-make-prog
--srcdir=.
--curdir
--ruby=/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/bin/ruby
--with-pg
--without-pg
--with-pg-dir
--without-pg-dir
--with-pg-include
--without-pg-include=${pg-dir}/include
--with-pg-lib
--without-pg-lib=${pg-dir}/lib
--with-pg-config
--without-pg-config
--with-pg_config
--without-pg_config
--with-pqlib
--without-pqlib
--with-libpqlib
--without-libpqlib
--with-ms/libpqlib
--without-ms/libpqlib




Gem files will remain installed in /Library/Ruby/Gems/1.8/gems/pg-0.11.0 for inspection.
Results logged to /Library/Ruby/Gems/1.8/gems/pg-0.11.0/ext/gem_make.out
81847 次浏览

通过在适当的环境变量前加上前缀来伪造 gem。如果您是从 MacPorts 安装,您应该能够完成以下步骤:

% /opt/local/lib/postgresql91/bin/pg_config
BINDIR = /opt/local/lib/postgresql91/bin
DOCDIR = /opt/local/share/doc/postgresql
HTMLDIR = /opt/local/share/doc/postgresql
INCLUDEDIR = /opt/local/include/postgresql91
PKGINCLUDEDIR = /opt/local/include/postgresql91
INCLUDEDIR-SERVER = /opt/local/include/postgresql91/server
LIBDIR = /opt/local/lib/postgresql91
PKGLIBDIR = /opt/local/lib/postgresql91
LOCALEDIR = /opt/local/share/locale
MANDIR = /opt/local/share/man
SHAREDIR = /opt/local/share/postgresql91
SYSCONFDIR = /opt/local/etc/postgresql91
PGXS = /opt/local/lib/postgresql91/pgxs/src/makefiles/pgxs.mk
CONFIGURE = '--prefix=/opt/local' '--sysconfdir=/opt/local/etc/postgresql91' '--bindir=/opt/local/lib/postgresql91/bin' '--libdir=/opt/local/lib/postgresql91' '--includedir=/opt/local/include/postgresql91' '--datadir=/opt/local/share/postgresql91' '--mandir=/opt/local/share/man' '--with-includes=/opt/local/include' '--with-libraries=/opt/local/lib' '--with-openssl' '--with-bonjour' '--with-readline' '--with-zlib' '--with-libxml' '--with-libxslt' '--enable-thread-safety' '--enable-integer-datetimes' '--with-ossp-uuid' 'CC=/usr/bin/gcc-4.2' 'CFLAGS=-pipe -O2 -arch x86_64' 'LDFLAGS=-L/opt/local/lib -arch x86_64' 'CPPFLAGS=-I/opt/local/include -I/opt/local/include/ossp'
CC = /usr/bin/gcc-4.2
CPPFLAGS = -I/opt/local/include -I/opt/local/include/ossp -I/opt/local/include/libxml2 -I/opt/local/include
CFLAGS = -pipe -O2 -arch x86_64 -Wall -Wmissing-prototypes -Wpointer-arith -Wdeclaration-after-statement -Wendif-labels -Wformat-security -fno-strict-aliasing -fwrapv
CFLAGS_SL =
LDFLAGS = -L/opt/local/lib -arch x86_64 -L/opt/local/lib -L/opt/local/lib -Wl,-dead_strip_dylibs
LDFLAGS_EX =
LDFLAGS_SL =
LIBS = -lpgport -lxslt -lxml2 -lssl -lcrypto -lz -lreadline -lm
VERSION = PostgreSQL 9.1beta1

从那里,拉出 LIBDIRINCLUDEDIRCPPFLAGSLIBSLDFLAGS(一个我认为将让你运行的是 LIBDIR,但是)。然后你就跑:

setenv PATH /opt/local/lib/postgresql91/bin:${PATH}
sudo env LDFLAGS=-L`pg_config --libdir` CPPFLAGS=`pg_config --cppflags` gem install pg

这样应该可以了,如果不行就告诉我。

我在使用 EnterpriseDB 时遇到了这个问题。Dmg.如果你使用的是同样的思想,我通过指定正确的架构来使它工作:

sudo env ARCHFLAGS="-arch i386" gem install pg

网上有一些教程说要为使用 MacPorts 的人指定一个不同的架构(比如“-arch x86 _ 64”) ,但是对我来说不起作用,因为我使用的是单一文件安装。

我不认为你需要 postgres 开发文件,你需要的一切应该已经包含在您的安装程序。更有可能的情况是,它们所安装的路径不在您的环境路径中,因此 gem 在尝试编译 pg 时无法找到它们。

您不应该以 root 身份运行 gem install pg,事实上,如果您这样做,您的 PATH (如果运行 w/sudo,则为 root 的 PATH)很可能不包含必要的信息。

下面这些对我来说通常很有用:

# Might be different depending on where your installer installed postgres 8.3
export PATH=$PATH:/Library/PostgreSQL/8.3/include/
export ARCHFLAGS='-arch x86_64'
gem install pg

也许你可以试试这个:

ARCHFLAGS="-arch i386 -arch x86_64" gem install pg

要了解库的体系结构,您可以使用

file /usr/local/lib/libpq.dylib

在我的例子中,它只给出了一种架构(通过自制安装) :

/usr/local/lib/libpq.dylib: Mach-O 64-bit dynamically linked shared library x86_64

解决方案: 使用 Homebrew 重新安装 PostgreSQL。

$ sudo su


$ env ARCHFLAGS="-arch x86_64" gem install pg


Building native extensions.  This could take a while...
Successfully installed pg-0.11.0
1 gem installed
Installing ri documentation for pg-0.11.0...
Installing RDoc documentation for pg-0.11.0...

成功了!

其他人提出的 ARCHFLAGS答案不会起作用,如果你以某种方式结束了一个64位版本的 postgres (自制程序将安装)和一个32位版本的 Ruby。由于某些原因,rbenv坚持为我构建 Ruby 1.9.2-p290作为32位,这使得它不可能与64位 postgres 链接。

检查 Ruby 二进制文件的体系结构

file `which ruby`

或者如果使用 rbenv

file `rbenv which ruby`

和你的邮差比较一下:

file `which postgres`

如果有一个错误的匹配,你将需要重新安装 postgres 或红宝石。使用 rbenv,我只需切换到一个不同的版本: 1.9.3-p194而不是 1.9.2-p290就可以解决这个问题。

我们之间的问题很奇怪。

ruby -v # was ok (rbenv)
gem -v # was ok (rbenv)

但是当我们进行 bundle 安装时,bundler 并没有安装在 rbenv 安装的 Ruby 版本中,所以,当我们输入 bundle install 时,它使用了系统的 bundler。

因此,在运行 bundle 安装之前,请确保通过运行

gem install bundler

这就是我如何在 Mavericks 上工作的。注意: 我已经从自制软件安装了 postgreql 9.3。

  1. 从 App Store 更新 Xcode 到5.0

  2. 安装命令行开发工具

    Xcode-select —— install

  3. 同意使用 Xcode 许可证

    Sudo xcodebuild-License

  4. 安装 gem

    ARCHFLAGS = “-arch x86 _ 64”gem install pg

所以基本上我是这样做的; -)

brew install postgres

如果使用约塞米蒂国家公园:

brew install postgres

然后:

ARCHFLAGS="-arch x86_64" gem install pg

最后,如果你想启动自动真空..。

postgres -D /usr/local/var/postgres

我尝试了这个最佳答案:

env ARCHFLAGS="-arch x86_64" gem install pg

但是当我再次尝试运行 bundle install 时,出现了同样的错误。然后我尝试了 ARCHFLAGS 的整个捆绑安装过程,如下所示:

ARCHFLAGS="-arch x86_64" bundle install

对我来说很管用! 请确保将 x86 _ 64替换为 i386,具体取决于您使用的架构。

我可能有点晚了,但在我的案例中,我使用了 rbenv 并升级到了 Ruby2.2.3。我不得不安装 Bundler 来让我的工作,我有一个旧的系统版本。

gem install bundler

这就是最终为我所做的(结合以前提供的多种解决方案和其他帖子) :

$sudo env ARCHFLAGS = “-arch x86 _ 64”gem install pg —— with-pg-include =/Library/PostgreSQL/9.6/include/

如上所述,这与在 rbenv /usr/bin/ruby: Mach-O universal binary with 2 architectures: [x86_64:Mach-O 64-bit executable x86_64] [i386:Mach-O executable i386]上有两个红宝石拱门有关,我要做的就是简单地安装 pg gem,强制使用 x86_64 arch 命令:

sudo env ARCHFLAGS="-arch x86_64" gem install pg

记得更新你的 bash_profile

添加 Postgres 的路径,在这种情况下我使用 Postgres 应用程序(OSX)而不是默认的 brew(https://postgresapp.com/) ,这是位置:

export PATH=/Applications/Postgres.app/Contents/Versions/10/bin:$PATH

重新加载 bash

sudo vi ~/.bash_profile

在这样做之后,我终于能够成功地安装 pg gem

希望这个能帮上忙!

在 Mac 上你可以试试这个(对我来说很管用) : Gem install pg —— with-pg-include =/Library/PostgreSQL/9.5/include 抓取: pg-1.0.0. gem (100%) 用‘ with-pg-include =/Library/PostgreSQL/9.5/include’构建本地扩展 这可能要花点时间。 成功安装 pg-1.0.0 Pg-1.0.0的解析文档 为 pg-1.0.0安装 ri 文档 3秒后完成 pg 的安装文档 安装了1个 gem

(本部分“/Library/PostgreSQL/9.5/include”必须放置 Postgres 路径)

错误消息就在这里:

Can't find the PostgreSQL client library (libpq)

你可以用自制软件来安装

brew install libpq

将出现以下或类似的信息:

If you need to have libpq first in your PATH, run:
echo 'export PATH="/opt/homebrew/opt/libpq/bin:$PATH"' >> ~/.zshrc


For compilers to find libpq you may need to set:
export LDFLAGS="-L/opt/homebrew/opt/libpq/lib"
export CPPFLAGS="-I/opt/homebrew/opt/libpq/include"

然后你可以运行它:

export PATH="/opt/homebrew/opt/libpq/bin:$PATH"
gem install pg

成交。

这些问题的答案大多集中在给出一个可以正常工作的命令。 但是 它们只在某些特定情况下起作用。 如果在确定应该运行哪个命令时遇到困难,那么您最好能够理解正在发生的情况。

为什么没用?

pg gem 是用 C 编写的本机扩展。它依赖于用于 C 应用程序的 PostgreSQL 库 libpq库。

因此,在构建过程中,pg gem 需要能够找到为相同的 建筑(例如 x86_64arm64)编译的库 libqp

如果:

  • 你在一台 m1的 Macbook (苹果硅)上,但是已经安装了 postgres在 rosetta2模式下。
  • 您使用的是64位计算机,但是已经安装了32位模式的 postgres

如果你最终处于这种情况,你有几个选择:

  • 尝试在与 postgres相同的架构中编译 pg gem
  • 重新安装 postgres 以匹配构建 pg gem的体系结构(默认情况下它与 ruby相同)

例子

例如,在我的例子中,我有一台 m1 Macbook。 我已经在“ rosetta2”模式(x86_64)下安装了 ruby,在“本机”模式(arm64)下安装了 postgres。

您可以使用 lipo -info命令检查架构:

which ruby
# You might need to use a different command if you use a ruby version manager
# "which ruby" if you use rvm
# "rbenv which ruby" if you use rbenv
# "asdf which ruby" if you use asdf
=> /Users/leo/.rbenv/versions/2.6.6/bin/ruby


lipo -info /Users/leo/.rbenv/versions/2.6.6/bin/ruby
=> /Users/leo/.rbenv/versions/2.6.6/bin/ruby is architecture: x86_64
which postgres
=> /opt/homebrew/bin/pg_config


lipo -info /opt/homebrew/bin/pg_config
=> Non-fat file: /opt/homebrew/bin/pg_config is architecture: arm64

为了解决这个问题,在我的例子中,我只需要向 PATH添加另一个版本的 postgres,这个版本是用 x86_64编译的。它允许 pg gem 能够在正确的架构中找到二进制文件:

export PATH=/usr/local/Cellar/postgresql/13.2_1/bin:$PATH
gem install pg


# and finally 🎉
=> Building native extensions. This could take a while...
=> Successfully installed pg-1.2.3
=> Parsing documentation for pg-1.2.3
=> Installing ri documentation for pg-1.2.3
=> Done installing documentation for pg after 1 seconds
=> 1 gem installed

对于那些尝试了顶级答案但是没有什么效果的人,我想我应该解释一下我的情况以及它是如何被修复的。

我曾经尝试在一个 Ruby 项目中使用 Postgres,使用 bundle install(在我的 gemfile 中使用 gem 'pg') ,但是我之前已经安装过 Postgres,可能是通过使用 npm install pg或者类似的东西。

我有一个现有的数据库,包含数据,我担心如果我运行 brew install postgres,它会擦除我现有的数据和表。

它没有! brew install postgres完全按照@成龙的建议工作

如果你想让你的头脑放松,你可以备份你的数据,如在这个链接 https://www.tecmint.com/backup-and-restore-postgresql-database/描述的例子。

cd desktop
pg_dump -U your_db_user your_database_name >> file_containing_backup.sql

来自 Postgre.app 的 libpq 不能在基于 ARM 的 Mac 上运行,因为 Postgre.app 没有为 ARM 发布(只有通用 Intel/ARM 软件包发布,在 ARM64上只是 x86 _ 64模拟) :

~ > file /Applications/Postgres.app/Contents/Versions/13/lib/libpq.dylib
/Applications/Postgres.app/Contents/Versions/13/lib/libpq.dylib: Mach-O 64-bit dynamically linked shared library x86_64

出于这个原因,我决定单独安装 libpq 和 Homebrew:

brew install libpq

然后安装 pg 可以实现以下功能:

gem install pg -- --with-pq-dir=/opt/homebrew/opt/libpq/

(MacOS 11.6 Big Sur on MacBook Pro 13“2020 with Apple M1 CPU)

对于我的 mac m1来说,在尝试了以上所有的解决方案之后,没有任何效果:

  • 安装 Homebrewx86

    • Brewx86将位于:/usr/local/Homebrew/bin/brew
    • 位于:/opt/homebrew/bin/brew64(我目前酿造的啤酒)
  • 使用 arch x86安装 libpq (因为 pg 必须使用 x86 libpq 编译)

    arch --x86_64 /usr/local/Homebrew/bin/brew install libpq

  • 安装 gem pg

    gem install pg -v '0.18.2' -- --with-pq-dir=/usr/local/Cellar/libpq/14.2 --with-pg-config=/usr/local/Cellar/libpq/14.2/bin/pg_config

嗯,我已经尝试了上面给出的所有解决方案

找不到 PostgreSQL 客户端库(libpq)

$ sudo su
$ env ARCHFLAGS="-arch x86_64" gem install pg

但什么都没帮上忙。 出于这个原因,我决定单独安装 libpq 和 Homebrew:

brew install libpq

然后发现了一个小问题:

brew link --force libpq

它将所有工具(不仅仅是 libpq)符号链接到/usr/local/bin 目录。现在可以运行 psql 并开始连接了。

如果你在 Mac M1 pro 中得到这个错误,硅芯片

问题:

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)

解决方案:

通过自制安装 libpq 并将其添加到 PATH

brew install libpq
echo 'export PATH="/opt/homebrew/opt/libpq/bin:$PATH"' >> ~/.zshrc
source ~/.zshrc
OR ~/bash_profile if you use it instead.

试试:

bundle install # OR
gem install pg

这对我有用。