Não foi possível encontrar a biblioteca do cliente PostgreSQL (libpq)

146

Estou tentando instalar o PostgreSQL for Rails no Mac OS X 10.6. Primeiro, tentei a instalação do MacPorts, mas não correu bem, e fiz a instalação do DMG com um clique. Isso pareceu funcionar.

Eu suspeito que preciso instalar os pacotes de desenvolvimento do PostgreSQL, mas não tenho idéia de como fazer isso no OS X.

Aqui está o que recebo quando tento fazer 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
fonte
Você instalou a versão 8.3 do postgresql ou está instalando alguma instalação antiga? Se for 8.3, as bibliotecas devem estar em /Library/PostgreSQL/8.3/lib, por favor, verifique se existe.
Eelke
Eu fiz a versão 8.3 e, sim, parece que tudo está lá.
Jason Swett
Você pode postar a saída pg_config? Isso deve facilitar a nossa ajuda.
Justis
Eu tive que adicionar a versão -v '0.14.0' para que ele trabalhou com com projecto mu
Matthieu Rouif

Respostas:

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

TRABALHOU!

Siddhartha Mukherjee
fonte
2
Eu tive que adicionar a versão "env ARCHFLAGS =" - arco x86_64" gem install -v '0.14.0'" para que ele trabalhou com com meu projeto
Matthieu Rouif
6
Trabalhou para o OS X Mavericks. Para mim, éenv ARCHFLAGS="-arch x86_64" gem install pg -v '0.17.1' -- --with-pg-config=/opt/local/lib/postgresql91/bin/pg_config
Dawei Yang 29/04
17
E se você usar "Postgres.app", em independentes, você deve fazer: env ARCHFLAGS = "- arch x86_64 gem install pg - --with-pg-config = / Aplicativos / Postgres.app / Conteúdo / Versões / 9.3 / bin / pg_config (Suponha que você usa Postgres.app versão 9.3, porque a localização do pg_config talvez mudada se você usar versão diferente, mas de qualquer maneira você pode encontrá-lo)
Zhaonan
2
Isso funcionou para mim e interrompeu uma parada de 2 horas. Eu sou novo nos trilhos e isso foi frustrante. Como o comentarista anterior, eu estava usando o instalador do Postgres.app no ​​Mavericks. Não percebeu que a variável env do ARCHFLGS era tão importante. Explicação aqui.
GNat
3
A questão é: por que isso funciona? O que faz "ARCHFLAGS =" - arch x86_64 "e por que a instalação da gema de baunilha não funciona? Não deve ser tão complicado instalar uma gema."
Jared Menard
78

Tentei a resposta mais bem avaliada aqui:

env ARCHFLAGS="-arch x86_64" gem install pg

Mas quando tentei executar a instalação do pacote novamente, ele teve o mesmo erro. Então, tentei a instalação completa do pacote com ARCHFLAGS da seguinte forma:

ARCHFLAGS="-arch x86_64" bundle install

Trabalhou para mim! Certifique-se de substituir x86_64 pelo i386, dependendo da arquitetura que você possui.

Christine Loh
fonte
2
Muito obrigado. Isto é o que funcionou para mim. Eu tenho tentado resolver esse problema para uma hora mais agora, e este código é o que o fez - ARCHFLAGS = "- arco x86_64" pacote instalar
piratetone
A adição de @piratetone aqui funcionou para mim em High Sierra
agendada para
Apreciado por @Christine, ele funcionou para mim em High Sierra
Ymow Wu
31

Eu estava tendo esse problema ao usar o .dmg do EnterpiseDB. Se é o mesmo que você usou, eu consegui especificar a arquitetura correta:

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

Existem alguns tutoriais na Web que dizem especificar uma arquitetura diferente (como "-arch x86_64" para pessoas que usavam o MacPorts), mas não estava funcionando para mim porque usei a instalação de arquivo único.

bobfet1
fonte
6
O x86_64 funcionou para mim (Mac OS 10.6.8, PostgreSQL instalado via homebrew: mxcl.github.com/homebrew )
chesterbr
2
Usou horas para encontrar uma solução e a sua funcionou, bobfet1 & @chester. Obrigado! :-))) ** sudo env ARCHFLAGS = "- arch x86_64" gem install pg **
rassom
24

Se você estiver usando o Yosemite:

brew install postgres

Então:

ARCHFLAGS="-arch x86_64" gem install pg

E (opcional) finalmente, se você deseja iniciar o autovacuum ...

postgres -D /usr/local/var/postgres
etusm
fonte
21

Talvez você possa tentar este:

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

Para conhecer a arquitetura da sua biblioteca, você pode usar

file /usr/local/lib/libpq.dylib 

que deu apenas 1 arquitetura no meu caso (instalado via homebrew):

/usr/local/lib/libpq.dylib: Mach-O 64-bit dynamically linked shared library x86_64
ybart
fonte
+1 Obrigado pela dica sobre saber qual arquitetura era minha biblioteca!
Spike
Verifique também a arquitetura do seu binário ruby.
Leopd
18

Solução: reinstalou o PostgreSQL com o Homebrew.

Jason Swett
fonte
1
Parabéns! Lembre-se de conceder a recompensa a alguém. Algumas pessoas tentaram muito ajudar, mesmo que não fosse a solução final, e os pontos de reputação já foram gastos quando você ofereceu a recompensa.
Justis15
2
Não sei por que isso é tem um -1, trabalhou para mim quando não dos outros métodos fez
Abe Petrillo
Também acabei tendo que usar o método ARCHFLAGS, mas não funcionou até depois de reinstalar o postresql com o homebrew.
perfil completo de Dave Cowart
Trabalhou para Yosemite (10.10.3). instalação do brew PostgreSQL
roosevelt
Isso não funcionou para mim. Gostaria de saber se isso tem algo a ver com o fato de eu estar usando o Ruby "embutido" (acho) em vez de qualquer outra coisa: |
Rogerdpack # 13/16
6

Falsifique gemprefixando as variáveis ​​de ambiente apropriadas. Se você estava instalando a partir do MacPorts, poderá seguir o seguinte procedimento:

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

De lá, puxe a LIBDIR, INCLUDEDIR, CPPFLAGS, LIBSe LDFLAGS(o que eu acho que vai levá-lo em execução é LIBDIR, no entanto). Então você executaria:

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

Isso deve bastar para você. Deixe-me saber se isso não acontecer.

Sean
fonte
Usei o instalador com um clique em vez do MacPorts for PostgreSQL. Não sei qual seria o comando equivalente.
precisa
Veja se você tem sorte com isso (acho que o script updatedb do Mac é executado no sábado à noite):locate pg_config
Sean
Ainda não sei o que isso significaria CPPFLAGSou LDFLAGS(não sei o que são isso, desculpe).
precisa
Oh, mas locate pg_configme mostrou algumas coisas, no entanto. E tentei apenas instalar o PostgreSQL via MacPorts e usar seu comando - não funcionou.
precisa
1
Atualizado o exemplo acima. Acredito que isso resolverá seu problema. O problema foi que LDFLAGSnão foi definido para o diretório que continha libpq. Veja acima para detalhes.
Sean
5

O problema que tivemos foi bem estranho.

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

mas quando de fato instalamos um pacote, o bundler não foi instalado para a versão do ruby ​​que foi instalada pelo rbenv; portanto, quando digitamos a instalação do pacote, ele utilizou o pacote do sistema.

Portanto, antes de executar a instalação do pacote configurável, certifique-se de ter instalado o bundler executando

gem install bundler
Tibastral
fonte
Isso funcionou no meu caso (novo macOS High Sierra, usando rbenv e instalando principalmente com brew). Bundle foi provavelmente usar as coisas da Apple, que era o problema ...
saza
3

Eu não acho que você precise dos arquivos de desenvolvimento do postgres, tudo o que você precisa deveria ter sido incluído no seu instalador. É mais provável que o caminho para o qual estão instalados não esteja no caminho do ambiente e, portanto, o gem não pode encontrá-los quando ele tenta compilar a página.

Você não deve executar gem install pgcomo root, na verdade, se o fizer, é provável que o PATH (PATH do root, se for executado com o sudo) não contenha as informações necessárias.

Normalmente, o seguinte funciona para mim:

# 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
fonte
A execução gem install pg(juntamente com os dois comandos anteriores) em vez de sudo gem install pgainda fornece exatamente os mesmos resultados.
precisa
Você está na arquitetura de 32 ou 64 bits? Você já tentou o acima com a outra bandeira de arquitetura? Você também mudou /Library/PostgreSQL/...para o local correto de onde está a sua cópia da instalação do postgres?
Brett Bender
Olhei para minhas anotações sobre como executar os comandos que listei. Parece que eu instalei o Postgres via sudo port install postgresql83 postgresql83-server, semelhante a estas instruções: flux88.com/2010/06/installing-postgresql-for-rails-on-mac-os-x . Parece que o instalador independente é de 32 bits, então você deseja definir seus sinalizadores de arco para 32 bits, mesmo que sua máquina seja de 64 bits. Se você não conseguir fazê-lo funcionar, sugiro desinstalar e reinstalar via MacPorts e tentar as instruções acima. Espero que ajude!
Brett Bender
3

Isto é o que finalmente fiz por mim (combinação de várias soluções fornecidas antes, juntamente com outras postagens):

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

Marcus Silveira
fonte
A solução acima funcionou para mim no Mac OS High Sierra usando ARCHFLAGS = "- arch x86_64" gem install pg -v '1.1.2' - com-pg-include = / usr / local / Cellar / postgresql / 10.5 / include Localize o caminho exato para a pasta de inclusão e atualize-o de acordo.
precisa saber é o seguinte
1

A ARCHFLAGSresposta que outros propuseram não funcionará se você, de alguma forma, tiver uma versão de 64 bits do postgres (que o homebrew instalará) e uma versão de 32 bits do ruby. Por alguma razão, rbenvinsiste em construir o ruby ​​1.9.2-p290 como 32 bits para mim, o que torna impossível vincular-se ao postgres de 64 bits.

Verifique a arquitetura do seu binário ruby ​​com

file `which ruby`

ou se estiver usando rbenv

file `rbenv which ruby`

E compare com o seu postgres:

file `which postgres`

Se houver uma incompatibilidade, você precisará reinstalar o postgres ou o ruby. Com o rbenv, resolvi isso mudando para uma versão diferente: em 1.9.3-p194vez de 1.9.2-p290.

Leopd
fonte
1

Foi assim que fiz funcionar no Mavericks. Nota: Eu já tinha instalado o postgresql 9.3 a partir do homebrew.

  1. Atualize o Xcode para 5.0 na App Store

  2. Instalar ferramentas de desenvolvedor de linha de comando

    xcode-select --install

  3. Concorde com a licença do Xcode

    sudo xcodebuild -license

  4. Instalar gema

    ARCHFLAGS = "- arch x86_64" instalação da gema pág.

Michał Szajbe
fonte
1

Então basicamente eu fiz isso ;-)

brew install postgres
Jackie Chan
fonte
O brew instala o libpq.so (dylib) como sua resposta implica?
Paul-Sebastian Manole
0

Provavelmente estou um pouco atrasado para a festa aqui, mas no meu caso eu estava usando rbenv e atualizando para o Ruby 2.2.3. Eu tive que instalar o Bundler para fazer o meu funcionar, eu tinha uma versão antiga do sistema.

gem install bundler

mchapman17
fonte
0

Como mencionado acima, isso tem a ver com o fato de ter dois ruby ​​archs na rbenv, o /usr/bin/ruby: Mach-O universal binary with 2 architectures: [x86_64:Mach-O 64-bit executable x86_64] [i386:Mach-O executable i386]que eu tinha que fazer era simplesmente instalar o pggem forçando o x86_64arco a ser usado com este comando:

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

Lembre- bash_profilese de atualizar seu

Adicione o caminho do seu postgres, neste caso, estou usando o app Postgres ( OSX) em vez de brew( https://postgresapp.com/ ) por padrão, este é o local:

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

Recarregue o bash com

sudo vi ~/.bash_profile

Depois de fazer isso, finalmente consegui instalar com êxito pg gem

Espero que isto ajude!

d1jhoni1b
fonte
0

No Mac, você pode tentar o seguinte (funciona para mim): gem install pg - with-pg-include = / Library / PostgreSQL / 9.5 / include Fetching: pg-1.0.0.gem (100%) Criando extensões nativas com: ' with-pg-include = / Library / PostgreSQL / 9.5 / include 'Isso pode demorar um pouco ... Instalado com êxito pg-1.0.0 Analisando a documentação da pg-1.0.0 Instalando a documentação da ri da pg-1.0.0 Concluída a instalação da documentação para pg após 3 segundos 1 gema instalada

(nesta parte "/Library/PostgreSQL/9.5/include", você deve colocar o caminho do Postgres)

Marcos Riveros
fonte