Не могу найти клиентскую библиотеку PostgreSQL (libpq)

Я пытаюсь установить PostgreSQL для Rails на Mac OS X 10.6. Сначала я попробовал установить 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

23 ответа

Решение

Решение: переустановить PostgreSQL с помощью Homebrew.

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

РАБОТАЛ!

Я попробовал самый лучший ответ здесь:

env ARCHFLAGS="-arch x86_64" gem install pg

Но когда я снова попытался запустить пакетную установку, возникла та же ошибка. Затем я попытался установить весь пакет с помощью ARCHFLAGS примерно так:

ARCHFLAGS="-arch x86_64" bundle install

Работал на меня! Обязательно замените x86_64 на i386 в зависимости от используемой архитектуры.

Сообщение об ошибке тут же:

      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

Сделанный.

У меня просто была эта проблема при использовании EnterpiseDB .dmg. Если это то же самое, что вы использовали, я заставил его работать, указав правильную архитектуру:

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

В Интернете есть несколько учебных пособий, в которых говорится, что нужно указать другую архитектуру (например, "-arch x86_64" для людей, использующих MacPorts), но у меня это не сработало, потому что я использовал установку одного файла.

Если вы используете Yosemite:

brew install postgres

Затем:

ARCHFLAGS="-arch x86_64" gem install pg

И (необязательно), наконец, если вы хотите запустить автоочистку...

postgres -D /usr/local/var/postgres

Может быть, вы можете попробовать это:

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

Чтобы узнать архитектуру вашей библиотеки вы можете использовать

file /usr/local/lib/libpq.dylib 

который дал только 1 архитектуру в моем случае (установленную через homebrew):

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

Если вы получаете эту ошибку в 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 через homebrew и добавьте его в 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

Это работает для меня.

Большинство из этих ответов сосредоточены на том, чтобы дать вам одну команду, которая просто работает. Однако они работают только для некоторых конкретных сценариев. Если у вас возникли проблемы с определением, какую команду следует запустить, вам лучше понять, что происходит.

Почему не работает?

Драгоценный камень - это собственное расширение, написанное на C. Он полагается на libpq библиотека, которая является библиотекой PostgreSQL для приложений C.

Итак, во время сборки гем должен иметь возможность найти библиотеку. libqpскомпилирован для той же архитектуры (например или).

Несоответствие может быть, если:

  • вы используете macbook m1 (яблочный кремний), но у вас установлен режим rosetta 2.
  • у вас 64-битный компьютер, но вы установили его в 32-битном режиме.

Если вы попали в такую ​​ситуацию, у вас есть несколько вариантов:

  • попробуйте скомпилировать драгоценный камень в той же архитектуре, что и
  • переустановите postgres в соответствии с архитектурой, в которой pg gem построен (по умолчанию такой же, как rubys)

Пример

Например, в моем случае у меня macbook m1. Я установил ruby ​​в режиме "rosetta 2" () и 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. Это позволило 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

Поддельные из 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

Оттуда вытащите LIBDIR, INCLUDEDIR, CPPFLAGS, LIBS а также LDFLAGS (тот, который я думаю, заставит вас бежать LIBDIR, тем не мение). Тогда вы бы запустили:

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

Это должно сделать это для вас. Дайте мне знать, если это не так.

Проблема у нас была довольно странная.

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

но когда мы фактически установили пакет, пакет не был установлен для версии ruby, которая была установлена ​​с помощью rbenv, поэтому, когда мы вводили пакетную установку, он использовал пакет системы.

Поэтому, прежде чем запускать пакетную установку, убедитесь, что вы установили пакет, запустив

gem install bundler

Мне не удалось собрать это с помощью libpq из Postgres.app, поэтому я решил установить libpq отдельно от Homebrew:

      brew install libpq

Затем установка pg работала с этим:

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

(MacOS 11.6 Big Sur, процессор Apple M1)

Ну, я пробовал все решения, приведенные выше для

Не удается найти клиентскую библиотеку PostgreSQL (libpq)

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

но ничего не помогло. По этой причине я решил установить libpq отдельно от Homebrew:

brew install libpq

затем нашел небольшую зацепку: libpq won't install itself in the /usr/local/bin directory for mac.Чтобы это произошло, вам нужно запустить:

brew link --force libpq

Это создаст символическую ссылку на все инструменты, а не только на libpq, в каталог /usr/local/bin. Теперь вы готовы запустить psql и начать подключение.

Вот что наконец-то сделал для меня (комбинация нескольких решений, предоставленных ранее вместе с другими постами):

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

Я не думаю, что вам нужны файлы разработки postgres, все, что вам нужно, должно быть включено в ваш установщик. Скорее всего, путь, по которому они установлены, находится не в пути к вашей среде, и поэтому gem не может найти их, когда пытается компилировать pg.

Вам не нужно бежать gem install pg как root, на самом деле, если вы это сделаете, скорее всего ваш PATH (PATH root при запуске с 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

ARCHFLAGS ответ, который предложили другие, не будет работать, если вы каким-то образом получили 64-битную версию postgres (которую установит homebrew) и 32-битную версию ruby. По какой-то причине 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,

Вот как я сделал это, чтобы работать на Маверикс. Примечание: я уже установил postgresql 9.3 от homebrew.

  1. Обновите Xcode до 5.0 из App Store

  2. Установите инструменты разработчика командной строки

    xcode-select --install

  3. Согласитесь с лицензией XCode

    sudo xcodebuild -license

  4. Установить драгоценный камень

    ARCHFLAGS="-arch x86_64" gem install pg

Для моего mac m1 после того, как я попробовал все вышеперечисленные решения, и ничего не получилось. Я заставил это работать:

  • Установить доморощенный x86

    • brew x86 будет располагаться по адресу: /usr/local/Homebrew/bin/brew
    • brew arm64 находится по адресу: /opt/homebrew/bin/brew (моя текущая заварка)
  • Установите libpq с архитектурой x86 (поскольку pg должен быть скомпилирован с x86 libpq)

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

  • Установить драгоценный камень стр.

    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

В общем, я сделал это;-)

brew install postgres

На Mac вы можете попробовать это (работает для меня): gem install pg - with-pg-include=/Library/PostgreSQL/9.5/include Fetching: pg-1.0.0.gem (100%) Создание собственных расширений с помощью: 'with-pg-include=/Library/PostgreSQL/9.5/include'Это может занять некоторое время... Успешно установленная pg-1.0.0 Разбор документации для pg-1.0.0 Установка документации ri для pg-1.0.0 Закончена установка документации для pg через 3 секунды 1 драгоценный камень установлен

(в этой части "/Library/PostgreSQL/9.5/include" вы должны указать путь к Postgres)

Вероятно, я немного опоздал на вечеринку, но в моем случае я использовал rbenv и обновился до Ruby 2.2.3. Я должен был установить Bundler, чтобы заставить мою работать, у меня была старая системная версия.

gem install bundler

Как упоминалось выше, это связано с тем фактом, что на 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 принуждение к драгоценным камням x86_64 Арка для использования с этой командой:

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

Надеюсь это поможет!

Для тех из вас, кто попробовал самые популярные ответы, но они не совсем сработали, я подумал, что объясню свою ситуацию и способы ее исправления.

Я пытался использовать postgres для проекта Ruby, используя bundle install (и с gem 'pg' в моем гем-файле), но у меня уже был установлен Postgres раньше, вероятно, с помощью npm install pg или что-то подобное.

У меня была существующая база данных с данными, и я был обеспокоен тем, что, если я запустил, она сотрет мои существующие данные и таблицы.

Это не так! brew install postgres отлично работал, как было предложено @Jackie Chan

Если вы хотите успокоиться, вы можете создать резервную копию своих данных, как описано по этой ссылке https://www.tecmint.com/backup-and-restore-postgresql-database/, например

      cd desktop
pg_dump -U your_db_user your_database_name >> file_containing_backup.sql
Другие вопросы по тегам