找不到PostgreSQL客户端库(libpq)

时间:2011-06-02 02:28:53

标签: ruby-on-rails ruby-on-rails-3 postgresql rubygems

我正在尝试在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

17 个答案:

答案 0 :(得分:346)

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

工作!

答案 1 :(得分:31)

使用EnterpiseDB .dmg时,我遇到了这个问题。如果您认为这是相同的,那么我通过指定正确的架构来实现它:

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

网上有一些教程可以指定一个不同的架构(比如使用MacPorts的人使用“-arch x86_64”),但是因为我使用了单个文件安装而无法使用它。

答案 2 :(得分:23)

如果使用Yosemite:

brew install postgres

然后:

ARCHFLAGS="-arch x86_64" gem install pg

(可选)最后,如果你想启动autovacuum ......

postgres -D /usr/local/var/postgres

答案 3 :(得分:21)

也许你可以尝试这个:

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

要了解您的库的架构,您可以使用

file /usr/local/lib/libpq.dylib 

在我的案例中只提供了1个架构(通过自制软件安装):

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

答案 4 :(得分:18)

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

答案 5 :(得分: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(我认为会让你运行的是{但是,{1}}。然后你就跑了:

LIBDIR

那应该为你做。如果没有,请告诉我。

答案 6 :(得分:5)

我们遇到的问题非常奇怪。

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

但是当我们实际进行捆绑安装时,没有为rbenv安装的ruby版本安装bundler,因此,当我们键入bundle install时,它使用了系统的bundler。

因此,在运行bundle install之前,请确保已通过运行

安装了bundler
gem install bundler

答案 7 :(得分:3)

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

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

以下通常对我有用:

# 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

答案 8 :(得分:3)

这是最终为我做的事情(之前提供的多种解决方案与其他帖子的组合):

$ sudo env ARCHFLAGS =“ - arch x86_64”gem install pg - with-pg-include = / Library / PostgreSQL / 9.6 / include /

答案 9 :(得分:2)

错误信息就在那里:

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

完成。

答案 10 :(得分:1)

这就是我在小牛队工作的方式。注意:我已经从homebrew安装了postgresql 9.3。

  1. 从App Store将Xcode更新为5.0

  2. 安装命令行开发人员工具

    xcode-select --install

  3. 同意Xcode许可证

    sudo xcodebuild -license

  4. 安装宝石

    ARCHFLAGS =“ - arch x86_64”gem install pg

答案 11 :(得分:1)

所以基本上我做了这个; - )

brew install postgres

答案 12 :(得分:1)

如果你以某种方式结束了64位版本的postgres(自制软件将安装)和32位版本的ruby,那么其他人提出的ARCHFLAGS答案将无效。出于某种原因,rbenv坚持将ruby 1.9.2-p290构建为32位,这样就无法链接到64位postgres。

使用

检查ruby二进制文件的体系结构
file `which ruby`

或者如果使用rbenv

file `rbenv which ruby`

与你的postgres比较:

file `which postgres`

如果不匹配,您需要重新安装postgres或ruby。使用rbenv我只需切换到另一个版本即可解决此问题:1.9.3-p194而不是1.9.2-p290

答案 13 :(得分:0)

我在这里可能有点晚了,但在我的情况下,我使用的是rbenv并升级到Ruby 2.2.3。我不得不安装Bundler让我的工作,我有一个旧的系统版本。

gem install bundler

答案 14 :(得分:0)

如上所述,这与在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 force x86_64拱形用于该命令:

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

记住要使您的bash_profile保持最新状态

添加您的postgres路径,在这种情况下,我默认使用Postgres应用(OSX)而非brewhttps://postgresapp.com/),这是位置:

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

使用

重新加载bash

sudo vi ~/.bash_profile

完成此操作后,我终于可以成功安装pg gem

希望这会有所帮助!

答案 15 :(得分:0)

在Mac上,您可以尝试以下操作(适用于我): gem install pg-使用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个宝石

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

答案 16 :(得分:0)

这些答案中的大多数都专注于为您提供一个有效的命令。 但是它们仅适用于某些特定场景。 如果您在确定应该运行哪个命令时遇到问题,您最好了解发生了什么。

为什么不起作用?

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

因此,在构建过程中,pg gem 需要能够找到为同一个 architecture 编译的库 libqp(例如 x86_64 或 {{1 }}).

在以下情况下可能存在不匹配:

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

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

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

示例

例如,就我而言,我有一台 m1 macbook。 我已经在“rosetta 2”模式 (ruby) 下安装了 ruby​​,在“本机”模式 (x86_64) 下安装了 postgres。

您可以使用 arm64 命令检查架构:

lipo -info
rbenv which ruby
=> /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 gem 能够在正确的架构中找到二进制文件:

pg