Nie można znaleźć biblioteki klienta PostgreSQL (libpq)

146

Próbuję zainstalować PostgreSQL dla Railsów na Mac OS X 10.6. Najpierw wypróbowałem instalację MacPorts, ale nie poszło dobrze, więc wykonałem instalację DMG jednym kliknięciem. To wydawało się działać.

Podejrzewam, że muszę zainstalować pakiety programistyczne PostgreSQL, ale nie mam pojęcia, jak to zrobić na OS X.

Oto, co otrzymuję, gdy próbuję to zrobić 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
Jason Swett
źródło
Czy zainstalowałeś wersję 8.3 postgresql, czy też pobiera jakąś starą instalację? Jeśli jest to biblioteka 8.3, powinny znajdować się w /Library/PostgreSQL/8.3/lib, sprawdź, czy tam jest.
Eelke
Zrobiłem wersję 8.3 i tak, wygląda na to, że wszystko tam jest.
Jason Swett
Czy możesz opublikować wynik z pg_config? To powinno nam ułatwić pomoc.
justis
Musiałem dodać wersję -v '0.14.0', aby działała z projektem mu
Matthieu Rouif

Odpowiedzi:

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

PRACOWANO!

Siddhartha Mukherjee
źródło
2
Musiałem dodać wersję "env ARCHFLAGS =" - arch x86_64 "gem install -v '0.14.0'", aby działała z moim projektem
Matthieu Rouif
6
Pracował dla OS X Mavericks. Dla mnie toenv ARCHFLAGS="-arch x86_64" gem install pg -v '0.17.1' -- --with-pg-config=/opt/local/lib/postgresql91/bin/pg_config
Dawei Yang
17
A jeśli używasz "Postgres.app", pod mavericks, powinieneś zrobić: env ARCHFLAGS = "- arch x86_64 gem install pg - --with-pg-config = / Applications / Postgres.app / Contents / Versions / 9.3 / bin / pg_config (Załóżmy, że używasz Postgres.app w wersji 9.3, ponieważ lokalizacja pg_config może się zmienić, jeśli używasz innej wersji, ale i tak możesz ją znaleźć)
Zhaonan
2
To zadziałało dla mnie i przerwało 2-godzinną przerwę. Jestem nowy w railach i to było frustrujące. Podobnie jak poprzedni komentator, korzystałem z instalatora Postgres.app na Mavericks. Nie zdawałem sobie sprawy, że zmienna env ARCHFLGS jest tak ważna. Wyjaśnienie tutaj.
GNat
3
Pytanie brzmi, dlaczego to działa? Co robi "ARCHFLAGS =" - arch x86_64 "i dlaczego instalacja klejnotu waniliowego nie działa? Instalacja klejnotu nie powinna być taka trudna.
Jared Menard
78

Wypróbowałem najlepiej ocenianą odpowiedź tutaj:

env ARCHFLAGS="-arch x86_64" gem install pg

Ale kiedy ponownie spróbowałem uruchomić instalację pakietu, wystąpił ten sam błąd. Następnie wypróbowałem całą instalację pakietu z ARCHFLAGS w następujący sposób:

ARCHFLAGS="-arch x86_64" bundle install

Pracował dla mnie! Upewnij się, że wymieniasz x86_64 na i386 w zależności od posiadanej architektury.

Christine Loh
źródło
2
Dziękuję bardzo. To właśnie zadziałało dla mnie. Od ponad godziny próbuję rozwiązać ten problem, a ten kod jest tym, co zrobił - ARCHFLAGS = "- arch x86_64" instalacja pakietu
pirateton Kwietnia
Dodatek @piratetone tutaj pracował dla mnie w High Sierra
tnaught
Doceniony za @Christine, zadziałał dla mnie na High Sierra
Ymow Wu
31

Miałem ten problem podczas korzystania z EnterpiseDB .dmg. Jeśli to ta sama myśl, której użyłeś, udało mi się ją uruchomić, określając odpowiednią architekturę:

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

W sieci jest kilka samouczków, które mówią o określaniu innej architektury (np. „-Arch x86_64” dla ludzi, którzy używali MacPorts), ale nie działało to dla mnie, ponieważ użyłem instalacji pojedynczego pliku.

bobfet1
źródło
6
x86_64 działał dla mnie (Mac OS 10.6.8, PostgreSQL zainstalowany przez homebrew: mxcl.github.com/homebrew )
chesterbr
2
Poświęciłem godziny na znalezienie rozwiązania, a twoje zadziałało, bobfet1 i @chester. Dzięki! :-))) ** sudo env ARCHFLAGS = "- arch x86_64" gem install pg **
rassom
24

Jeśli korzystasz z Yosemite:

brew install postgres

Następnie:

ARCHFLAGS="-arch x86_64" gem install pg

I (opcjonalnie) na koniec, jeśli chcesz uruchomić autoodkurzanie ...

postgres -D /usr/local/var/postgres
etusm
źródło
21

Może możesz spróbować tego:

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

Aby poznać architekturę swojej biblioteki, której możesz użyć

file /usr/local/lib/libpq.dylib 

co dało tylko 1 architekturę w moim przypadku (zainstalowana przez homebrew):

/usr/local/lib/libpq.dylib: Mach-O 64-bit dynamically linked shared library x86_64
ybart
źródło
+1 Dziękuję za podpowiedź o tym, jaką architekturą była moja biblioteka!
Spike
Sprawdź także architekturę swojego pliku binarnego Ruby.
Leopd
18

Rozwiązanie: przeinstalowano PostgreSQL z Homebrew.

Jason Swett
źródło
1
Gratulacje! Pamiętaj, aby przyznać komuś nagrodę. Kilku ludzi bardzo starało się pomóc, nawet jeśli nie było to ostateczne rozwiązanie, a punkty reputacji zostały już wydane, gdy zaoferowałeś nagrodę.
justis
2
Nie jestem pewien, dlaczego to ma -1, zadziałało dla mnie, gdy żadna z innych metod nie zadziałała
Abe Petrillo
Skończyło się również na tym, że musiałem użyć metody ARCHFLAGS, ale nie zadziałała, dopóki nie zainstalowałem ponownie postresql z homebrew.
Dave Cowart
Pracował dla Yosemite (10.10.3). brew zainstaluj PostgreSQL
roosevelt
To nie zadziałało dla mnie. Ciekawe, czy ma to coś wspólnego z faktem, że używam „wbudowanego” Rubiego (tak mi się wydaje) zamiast czegokolwiek innego: |
rogerdpack
6

Fałsz, gempoprzedzając odpowiednie zmienne środowiskowe. Jeśli instalowałeś z MacPorts, powinieneś być w stanie przejść przez następującą procedurę:

% /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

Stamtąd wyciągnąć LIBDIR, INCLUDEDIR, CPPFLAGS, LIBSoraz LDFLAGS(ten, który moim zdaniem będzie Ci uruchomiony jest LIBDIRjednak). Wtedy uciekłbyś:

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

To powinno wystarczyć. Daj mi znać, jeśli nie.

Sean
źródło
Użyłem instalatora jednym kliknięciem zamiast MacPorts dla PostgreSQL. Nie wiem, jakie byłoby równoważne polecenie.
Jason Swett
Sprawdź, czy ci się poszczęści (myślę, że skrypt updatedb Maca działa w sobotę wieczorem):locate pg_config
Sean
Nadal nie wiem, co to by oznaczało dla CPPFLAGSlub LDFLAGS(nie wiem, co to jest, przepraszam).
Jason Swett
Och, ale locate pg_configpokazał mi trochę rzeczy. Próbowałem po prostu zainstalować PostgreSQL przez MacPorts i używając twojego polecenia - nie zadziałało.
Jason Swett
1
Zaktualizowano powyższy przykład. Wierzę, że to rozwiąże Twój problem. Problem polegał na tym, że LDFLAGSnie ustawiono katalogu, który zawierał libpq. Szczegółowe informacje znajdują się powyżej.
Sean
5

Problem, który mieliśmy, był dość dziwny.

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

ale kiedy w rzeczywistości wykonaliśmy instalację pakietową, pakiet nie był zainstalowany dla wersji Ruby, która była instalowana przez rbenv, więc kiedy wpisaliśmy instalację pakietową, używał bundlera systemu.

Dlatego przed uruchomieniem instalacji pakietu upewnij się, że zainstalowałeś pakiet, uruchamiając

gem install bundler
Tibastral
źródło
To zadziałało w moim przypadku (świeży macOS High Sierra, używając rbenv i instalując głównie z brew). Pakiet prawdopodobnie używał rzeczy z Apple, to był problem ...
saza
3

Myślę, że nie potrzebujesz plików rozwojowych postgres, wszystko, czego potrzebujesz, powinno być dołączone do twojego instalatora. Bardziej prawdopodobne jest, że ścieżka, na której są instalowane, nie znajduje się w ścieżce twojego środowiska i dlatego gem nie może ich znaleźć, gdy próbuje skompilować pg.

Nie powinieneś uruchamiać się gem install pgjako root, w rzeczywistości, jeśli to zrobisz, prawdopodobnie twoja PATH (PATH roota, jeśli jest uruchomiona w / sudo) nie będzie zawierała niezbędnych informacji.

Zwykle działa dla mnie:

# 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
Brett Bender
źródło
Uruchomienie gem install pg(wraz z dwoma poprzednimi poleceniami) zamiast sudo gem install pgnadal daje dokładnie te same wyniki.
Jason Swett
Czy korzystasz z architektury 32- czy 64-bitowej? Czy wypróbowałeś powyższe z inną flagą architektury? Czy zmieniłeś /Library/PostgreSQL/...również poprawną lokalizację, gdziekolwiek jest twoja kopia instalacji postgres?
Brett Bender
Zajrzałem do moich notatek na temat wykonywania poleceń, które wymieniłem. Wygląda na to, że zainstalowałem Postgres przez sudo port install postgresql83 postgresql83-server, podobnie do tych instrukcji: flux88.com/2010/06/installing-postgresql-for-rails-on-mac-os-x . Wygląda na to, że samodzielny instalator jest 32-bitowy, więc chcesz ustawić flagi arch na 32-bitowe, nawet jeśli twoja maszyna jest 64-bitowa. Jeśli nie możesz go uruchomić, sugeruję odinstalowanie i ponowną instalację za pośrednictwem MacPorts, a następnie wykonanie powyższych instrukcji. Mam nadzieję, że to pomoże!
Brett Bender
3

Oto, co ostatecznie zrobiłem dla mnie (połączenie wielu rozwiązań dostarczonych wcześniej wraz z innymi postami):

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

Marcus Silveira
źródło
Powyższe rozwiązanie działało dla mnie w 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 Znajdź dokładną ścieżkę do folderu dołączanego i odpowiednio ją zaktualizuj.
maniempire
1

ARCHFLAGSOdpowiedź, że inni zaproponowali nie będzie działać, jeśli jakoś skończyło się w wersji 64-bitowej wersji PostgreSQL (który będzie zainstalować homebrew) oraz w wersji 32-bitowej rubinu. Z jakiegoś powodu rbenvnalega na zbudowanie dla mnie ruby ​​1.9.2-p290 jako 32-bitowego, co uniemożliwia linkowanie z 64-bitowymi postgresami.

Sprawdź architekturę swojego pliku binarnego Ruby za pomocą

file `which ruby`

lub jeśli używasz rbenv

file `rbenv which ruby`

I porównaj z postgresami:

file `which postgres`

Jeśli nie ma dopasowania, musisz ponownie zainstalować postgres lub ruby. Dzięki rbenv rozwiązałem to, po prostu przełączając się na inną wersję: 1.9.3-p194zamiast 1.9.2-p290.

Leopd
źródło
1

W ten sposób udało mi się pracować na Mavericks. Uwaga: już zainstalowałem postgresql 9.3 z homebrew.

  1. Zaktualizuj Xcode do 5.0 z App Store

  2. Zainstaluj narzędzia programistyczne wiersza poleceń

    xcode-select --install

  3. Zgadzam się na licencję Xcode

    sudo xcodebuild -license

  4. Zainstaluj klejnot

    ARCHFLAGS = "- arch x86_64" gem install pg

Michał Szajbe
źródło
1

Więc w zasadzie zrobiłem to ;-)

brew install postgres
Jackie Chan
źródło
Czy brew instaluje libpq.so (dylib), jak sugeruje twoja odpowiedź?
Paul-Sebastian Manole
0

Prawdopodobnie trochę się spóźniłem na imprezę tutaj, ale w moim przypadku używałem rbenv i aktualizowałem do Ruby 2.2.3. Musiałem zainstalować Bundler, aby mój działał, miałem starą wersję systemu.

gem install bundler

mchapman17
źródło
0

Jak wspomniano powyżej, ma to związek z faktem posiadania dwóch łuków rubinowych na 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]co musiałem zrobić, to po prostu zainstalować pgklejnot wymuszający x86_64arch do użycia z tym poleceniem:

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

Pamiętaj, aby mieć bash_profileaktualne informacje

Dodaj ścieżkę do swoich postgresów, w tym przypadku używam aplikacji Postgres ( OSX) zamiast brew( https://postgresapp.com/ ) domyślnie jest to lokalizacja:

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

Załaduj ponownie bash za pomocą

sudo vi ~/.bash_profile

Po wykonaniu tej czynności udało mi się w końcu pomyślnie zainstalować pg gem

Mam nadzieję że to pomoże!

d1jhoni1b
źródło
0

Na Macu możesz spróbować tego (działa dla mnie): gem install pg - with-pg-include = / Library / PostgreSQL / 9.5 / include Fetching: pg-1.0.0.gem (100%) Budowanie natywnych rozszerzeń z: ' with-pg-include = / Library / PostgreSQL / 9.5 / include 'Może to chwilę potrwać ... Pomyślnie zainstalowano pg-1.0.0 Analizowanie dokumentacji dla pg-1.0.0 Instalowanie dokumentacji ri dla pg-1.0.0 Zakończono instalację dokumentacji za pg po 3 sekundach zainstalowano 1 klejnot

(w tej części „/Library/PostgreSQL/9.5/include” musisz podać swoją ścieżkę do Postgres)

Marcos Riveros
źródło