无法找到PostgreSQL客户端库(libpq)。

170

我正在尝试在Mac OS X 10.6上安装用于Rails的PostgreSQL。首先,我尝试了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

你是否安装了8.3版本的PostgreSQL,或者它正在使用旧的安装程序?如果是8.3版本,库文件应该在/Library/PostgreSQL/8.3/lib,请检查是否存在。 - Eelke
我做了8.3版本,是的,看起来一切都在那里。 - Jason Swett
你能发布 pg_config 的输出吗?这样我们就更容易帮助你了。 - justis
我不得不添加版本-v '0.14.0',以便它能够与我的项目一起工作。 - Matthieu Rouif
23个回答

356
$ 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...

成功了!


2
我不得不添加版本“env ARCHFLAGS =” -arch x86_64“ gem install -v'0.14.0'”,以便它与我的项目一起使用。 - Matthieu Rouif
7
适用于OS X Mavericks操作系统。对我而言,这段代码的意思是:env ARCHFLAGS="-arch x86_64" gem install pg -v '0.17.1' -- --with-pg-config=/opt/local/lib/postgresql91/bin/pg_config,请帮我将其翻译成中文。 - Dawei Yang
18
如果您在Mavericks系统下使用"Postgres.app",请执行以下操作:env ARCHFLAGS="-arch x86_64 gem install pg -- --with-pg-config=/Applications/Postgres.app/Contents/Versions/9.3/bin/pg_config。假设您使用的是Postgres.app 9.3版本,因为如果您使用不同的版本,pg_config的位置可能会改变,但无论如何,您都可以找到它。 - Zhaonan
2
这对我很有用,解决了2小时的停顿。我是Rails的新手,这让我感到沮丧。和之前的评论者一样,我在Mavericks上使用Postgres.app安装程序。没有意识到ARCHFLGS环境变量如此重要。[在此处解释。](http://deveiate.org/code/pg/README-OS_X_rdoc.html#documentation) - GNat
3
问题是,为什么这个方法可行? "ARCHFLAGS="-arch x86_64"" 是什么意思?为什么普通的 gem 安装无法生效?安装一个 gem 不应该如此棘手。 - Jared Menard
显示剩余6条评论

79

我尝试了这里排名最高的答案:

env ARCHFLAGS="-arch x86_64" gem install pg

但当我尝试再次运行bundle install时,出现了相同的错误。然后我尝试使用ARCHFLAGS执行整个bundle install,就像这样:

ARCHFLAGS="-arch x86_64" bundle install

对我有用!请确保根据您的体系结构将x86_64替换为i386。


2
非常感谢。这就是对我有用的东西。我一直在尝试解决这个问题,已经一个多小时了,而这段代码就是解决它的方法 - ARCHFLAGS="-arch x86_64" bundle install。 - piratetone
@piratetone 在这里提供的内容对我在 High Sierra 上起到了作用。 - tnaught
感谢@Christine,这在我的High Sierra上有效。 - Ymow Wu

32
错误信息就在这里:
Can't find the PostgreSQL client library (libpq)

您可以使用Homebrew来安装它进行修复。
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

完成。


9
太棒了!它可以在MacBook Pro M1上运行。感谢更新! - Salo Charabati
1
非常感谢!这对于 MacBook Pro M1 也有帮助。 - dismir
在我的 M1 MacBook Air 上工作良好,谢谢! - Kaka Ruto
1
它在 MacBook Pro M1 2021 上运行良好。 - Almokhtar

31

我在使用EnterpiseDB .dmg时也遇到了这个问题。如果您也是使用的这个,请尝试指定正确的架构,这样可以解决问题。

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

网络上有一些教程说要指定不同的架构(例如对于使用MacPorts的人来说,是“-arch x86_64”),但这对我没有效果,因为我使用了单文件安装。


6
x86_64 适用于我(Mac OS 10.6.8,PostgreSQL 通过 homebrew 安装:http://mxcl.github.com/homebrew/)。 - chesterbr
2
用了好几个小时才找到解决方案,你们的方法有效,bobfet1和@chester。谢谢!:-)))sudo env ARCHFLAGS="-arch x86_64" gem install pg - rassom

25

如果使用Yosemite操作系统:

brew install postgres

那么:

ARCHFLAGS="-arch x86_64" gem install pg

并且(可选的)最后,如果你想启动自动清理程序...

postgres -D /usr/local/var/postgres

25

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


1
恭喜!记得将赏金授予某人。有些人尽力帮忙,即使不是最终解决方案,当你提供赏金时,声望点数已经花费了。 - justis
2
不确定为什么这个得到了-1,但在其他方法都无效时,它对我有效。 - Abe Petrillo
我最终不得不使用ARCHFLAGS方法,但在使用homebrew重新安装postresql之后才起作用。 - Dave Cowart
适用于Yosemite(10.10.3)。brew install PostgreSQL。 - roosevelt
这对我没用。不知道是否与我使用“内置”的Ruby(我想)有关,而不是其他任何东西 :| - rogerdpack

21

或许你可以试试这个:

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

了解你的库的架构,你可以使用

file /usr/local/lib/libpq.dylib 

在我的情况下(通过homebrew安装),它只提供了一种架构:

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

+1 感谢您提供的提示,让我知道了我的库所使用的架构! - Spike
还要检查您的 Ruby 二进制文件的架构。 - Leopd

16

如果您在使用 Mac M1 Pro 或 Silicon 芯片时遇到此错误

问题:

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)

解决方案:

使用Homebrew安装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

这对我有效。


1
这个完美地起作用了,谢谢! - Jason White

16

大多数答案都着重于给你一个只起作用的命令。 然而,它们只适用于某些特定情况。 如果你不知道应该运行哪个命令,最好了解正在发生什么。

为什么它不起作用?

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

因此,在构建过程中,需要能够找到为同一架构(例如x86_64arm64)编译的libqp库。

如果存在不匹配,可能会出现以下情况:

  • 您使用的是m1 macbook(苹果芯片),但已在rosetta 2模式下安装了postgres
  • 您使用的是64位计算机,但已在32位模式下安装了postgres

如果您遇到这种情况,有几种选择:

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

示例

例如,在我的情况下,我有一个m1 macbook。 我已经在“rosetta 2”模式下安装了ruby(x86_64),并且在“本地”模式下安装了postgres(arm64)。

您可以使用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中另一个在x86_64上编译的postgres版本添加到其中。这使得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

感谢您帮助我理解潜在的问题。在尝试了以上所有答案失败后,我终于解决了我的问题。 - sbmsr
谢谢 - 这正是我的问题,感谢您的解释! - Michael Taylor
在互联网上所有的解决方案中,这个确实有效。谢谢@leo。 - Rahul Bera

6

通过添加适当的环境变量来欺骗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

这应该对你有所帮助。如果不行,请告诉我。


我使用了一键安装程序而不是 MacPorts 安装 PostgreSQL。我不知道相应的命令是什么。 - Jason Swett
哦,但是 locate pg_config 确实给我显示了一些东西。我尝试通过 MacPorts 安装 PostgreSQL 并使用您的命令 - 但没有成功。 - Jason Swett
错误信息是什么?你是否将 pg_config 的路径添加到了你的 PATH 中? - Sean
您的命令输出与我最初得到的完全相同。是的,我确实将 pg_config 的路径添加到了我的 PATH 中。 - Jason Swett
1
更新了上面的例子。我相信这会解决你的问题。问题在于 LDFLAGS 没有设置到包含 libpq 的目录中。详见上文。 - Sean
显示剩余4条评论

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