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

146

Я пытаюсь установить 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
Джейсон Светт
источник
Вы установили версию 8.3 из postgresql или это старая установка? Если это 8.3 библиотеки должны быть в /Library/PostgreSQL/8.3/lib, пожалуйста, проверьте, есть ли он там.
Eelke
Я сделал версию 8.3 и, да, похоже, все есть.
Джейсон Светт
Вы можете опубликовать вывод от pg_config? Это должно облегчить нам помощь.
Юстис
Мне пришлось добавить версию -v '0.14.0', чтобы она работала с проектом mu
Matthieu Rouif

Ответы:

347
$ 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
6
Работал на 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
Давэй Ян
17
И если вы используете «Postgres.app» в разделе mavericks, вы должны сделать: 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 часа остановки. Я новичок в рельсах, и это было неприятно. Как и предыдущий комментатор, я использовал установщик Postgres.app на Mavericks. Не понимал, что переменная ench ARCHFLGS так важна. Объяснение здесь.
GNat
3
Вопрос в том, почему это работает? Что делает «ARCHFLAGS =» - arch x86_64 »и почему не работает установка vanilla gem? Установка гема не должна быть такой хитрой.
Джаред Менард
78

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

env ARCHFLAGS="-arch x86_64" gem install pg

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

ARCHFLAGS="-arch x86_64" bundle install

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

Кристина Ло
источник
2
Огромное спасибо. Это то, что сработало для меня. Я пытался решить эту проблему в течение часа плюс, и этот код - то, что сделал это - ARCHFLAGS = "- arch x86_64" комплектация установки
пираттон
Добавление @piratetone здесь сработало для меня в High Sierra
tnaught
Признанный за @Christine, он работал для меня на Высокой Сьерре
Ymow Wu
31

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

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

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

bobfet1
источник
6
x86_64 работал для меня (Mac OS 10.6.8, PostgreSQL, установленный через homebrew: mxcl.github.com/homebrew )
chesterbr
2
Потратил несколько часов, чтобы найти решение, и ваш работал, bobfet1 & @chester. Спасибо! :-))) ** sudo env ARCHFLAGS = "- arch x86_64" gem install pg **
rassom
24

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

brew install postgres

Затем:

ARCHFLAGS="-arch x86_64" gem install pg

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

postgres -D /usr/local/var/postgres
etusm
источник
21

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

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
ybart
источник
+1 Спасибо за подсказку о знании архитектуры моей библиотеки!
Спайк
Также проверьте архитектуру вашего двоичного файла ruby.
Леопд
18

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

Джейсон Светт
источник
1
Congrats! Не забудьте присуждать награду кому-то. Несколько человек изо всех сил пытались помочь, даже если это не было окончательным решением, а очки репутации уже были потрачены, когда вы предлагали вознаграждение.
Юстис
2
Не уверен, почему это получил -1, работал для меня, когда не один из других методов сделал
Абэ Петрильо
Мне также пришлось использовать метод ARCHFLAGS, но он не работал до переустановки postresql с homebrew.
Дэйв Кауарт,
Работал на Йосемити (10.10.3). Brew установить PostgreSQL
Рузвельт
Это не сработало для меня. Интересно, связано ли это с тем, что я использую «встроенный» Ruby (я думаю) вместо всего остального: |
rogerdpack
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

Оттуда, вытащить 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

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

Шон
источник
Я использовал установщик одним щелчком вместо MacPorts для PostgreSQL. Я не знаю, какой будет эквивалентная команда.
Джейсон Светт
Посмотрим, повезет ли вам с этим (я думаю, что скрипт updatedb для Mac запускается в субботу вечером):locate pg_config
Шон
Я до сих пор не знаю, что это будет значить CPPFLAGSили LDFLAGS(я не знаю, что это такое, извините).
Джейсон Светт
О, но все locate pg_configже показал мне кое-что. И я попробовал просто установить PostgreSQL через MacPorts и использовать вашу команду - не сработало.
Джейсон Светт
1
Обновил приведенный выше пример. Я считаю, что это решит вашу проблему. Подвох в том, что LDFLAGSон не был установлен в каталог, который содержал libpq. Смотрите выше для деталей.
Шон
5

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

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

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

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

gem install bundler
Tibastral
источник
В моем случае это сработало (свежая macOS High Sierra, использующая rbenv и устанавливаемая в основном с brew). Bundle, скорее всего , используя вещи из яблока, это проблема ...
Saza
3

Я не думаю, что вам нужны файлы разработки 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
Бретт Бендер
источник
Запуск gem install pg(вместе с вашими двумя предыдущими командами) вместо того, чтобы sudo gem install pgвсе еще давать те же самые результаты.
Джейсон Светт
Вы на 32- или 64-битной архитектуре? Вы пробовали выше с другим флагом архитектуры? Также вы изменили /Library/PostgreSQL/...правильное местоположение, где находится ваша копия установки postgres?
Бретт Бендер
Заглянул в мои заметки о выполнении команд, которые я перечислил. Похоже, я установил Postgres через sudo port install postgresql83 postgresql83-server, как показано в этой инструкции: flux88.com/2010/06/install-postgresql-for-rails-on-mac-os-x . Кажется, что автономный установщик является 32-битным, поэтому вы хотите установить флаги arch на 32-битные, даже если ваша машина 64-битная. Если вы не можете заставить его работать, я бы предложил удалить и переустановить через MacPorts, а затем попробовать описанные выше инструкции. Надеюсь, это поможет!
Бретт Бендер
3

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

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

Маркус Сильвейра
источник
Приведенное выше решение работало для меня в Mac OS High Sierra sudo env ARCHFLAGS = "- arch x86_64" gem install pg -v '1.1.2' - with-pg-include = / usr / local / Cellar / postgresql / 10.5 / include Найдите точный путь для папки include и обновите его соответствующим образом.
maniempire
1

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

Leopd
источник
1

Вот как я сделал это, чтобы работать на Маверикс. Примечание: я уже установил 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

Михал Шайбе
источник
1

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

brew install postgres
Джеки Чан
источник
Brew устанавливает libpq.so (dylib), как следует из вашего ответа?
Пол-Себастьян Маноле
0

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

gem install bundler

mchapman17
источник
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]было две рубиновых архива, что мне нужно было просто установить pggem, заставляя x86_64arch использовать эту команду:

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

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

d1jhoni1b
источник
0

На 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)

Маркос Риверос
источник