No se puede encontrar la biblioteca de cliente PostgreSQL (libpq)

146

Estoy tratando de instalar PostgreSQL para Rails en Mac OS X 10.6. Primero probé la instalación de MacPorts pero no funcionó bien, así que hice la instalación de DMG con un solo clic. Eso pareció funcionar.

Sospecho que necesito instalar los paquetes de desarrollo de PostgreSQL, pero no tengo idea de cómo hacerlo en OS X.

Esto es lo que obtengo cuando intento hacer 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
fuente
¿Instaló la versión 8.3 de postgresql o está recogiendo alguna instalación antigua? Si es 8.3, las bibliotecas deben estar en /Library/PostgreSQL/8.3/lib, compruebe si está allí.
Eelke
Hice la versión 8.3 y, sí, parece que todo está allí.
Jason Swett
¿Puedes publicar la salida de pg_config? Eso debería facilitarnos la ayuda.
justis
Tuve que agregar la versión -v '0.14.0' para que funcionara con el proyecto mu
Matthieu Rouif

Respuestas:

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

¡TRABAJÓ!

Siddhartha Mukherjee
fuente
2
Tuve que agregar la versión "env ARCHFLAGS =" - arch x86_64 "gem install -v '0.14.0'" para que funcione con mi proyecto
Matthieu Rouif
66
Trabajó para OS X Mavericks. Para mí, esenv ARCHFLAGS="-arch x86_64" gem install pg -v '0.17.1' -- --with-pg-config=/opt/local/lib/postgresql91/bin/pg_config
Dawei Yang
17
Y si usa "Postgres.app", debajo de disidentes, debe hacer: env ARCHFLAGS = "- arch x86_64 gem install pg - --with-pg-config = / Applications / Postgres.app / Contents / Versions / 9.3 / bin / pg_config (Suponga que usa Postgres.app versión 9.3, porque la ubicación de pg_config puede cambiar si usa una versión diferente, pero de todos modos puede encontrarla)
Zhaonan
2
Esto funcionó para mí y rompió un paro de 2 horas. Soy nuevo en los rieles y esto fue frustrante. Al igual que el comentarista anterior, estaba usando el instalador Postgres.app en Mavericks. No me di cuenta de que la variable env de ARCHFLGS era tan importante. Explicación aquí.
GNat
3
La pregunta es, ¿por qué funciona esto? ¿Qué hace "ARCHFLAGS =" - arch x86_64 "y por qué no funciona la instalación de gemas de vainilla? No debería ser tan complicado instalar una gema.
Jared Menard
78

Intenté la respuesta mejor calificada aquí:

env ARCHFLAGS="-arch x86_64" gem install pg

Pero cuando intenté ejecutar la instalación del paquete nuevamente, tuve el mismo error. Luego probé la instalación completa del paquete con ARCHFLAGS de esta manera:

ARCHFLAGS="-arch x86_64" bundle install

¡Trabajó para mi! Asegúrese de reemplazar x86_64 con i386 según la arquitectura que tenga.

Christine Loh
fuente
2
Muchas gracias. Esto es lo que funcionó para mí. He intentado resolver este problema durante una hora más ahora, y este código es lo que lo hizo - ARCHFLAGS = "- instalación del paquete arch x86_64"
piratetone
La incorporación de @piratetone aquí funcionó para mí en High Sierra
tnaught
Apreciado por @Christine, me funcionó en High Sierra
Ymow Wu
31

Estaba teniendo este problema al usar EnterpiseDB .dmg. Si eso es lo mismo que usaste, lo hice funcionar especificando la arquitectura correcta:

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

Hay algunos tutoriales en la web que dicen especificar una arquitectura diferente (como "-arch x86_64" para las personas que usaron MacPorts) pero no funcionó para mí porque usé la instalación de un solo archivo.

bobfet1
fuente
66
x86_64 funcionó para mí (Mac OS 10.6.8, PostgreSQL instalado a través de homebrew: mxcl.github.com/homebrew )
chesterbr
2
Han utilizado horas para encontrar una solución y la suya funcionó, bobfet1 y @chester. ¡Gracias! :-))) ** sudo env ARCHFLAGS = "- arch x86_64" gem install pg **
rassom
24

Si usa Yosemite:

brew install postgres

Luego:

ARCHFLAGS="-arch x86_64" gem install pg

Y (opcional) finalmente, si desea iniciar autovacuum ...

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

Quizás puedas probar este:

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

Para conocer la arquitectura de tu biblioteca puedes usar

file /usr/local/lib/libpq.dylib 

que dio solo 1 arquitectura en mi caso (instalado a través de homebrew):

/usr/local/lib/libpq.dylib: Mach-O 64-bit dynamically linked shared library x86_64
ybart
fuente
+1 ¡Gracias por la pista sobre saber qué arquitectura era mi biblioteca!
Spike
También verifique la arquitectura de su binario ruby.
Leopd
18

Solución: reinstalé PostgreSQL con Homebrew.

Jason Swett
fuente
1
Felicidades! Recuerde otorgar la recompensa a alguien. Algunas personas trataron de ayudar, incluso si no era la solución final, y los puntos de reputación ya se gastaron cuando ofreció la recompensa.
justis
2
No estoy seguro de por qué esto tiene un -1, funcionó para mí cuando ninguno de los otros métodos lo hizo
Abe Petrillo
También terminé teniendo que usar el método ARCHFLAGS, pero no funcionó hasta después de reinstalar postresql con homebrew.
Dave Cowart el
Trabajó para Yosemite (10.10.3). brebaje instalar PostgreSQL
Roosevelt
Esto no funcionó para mí. Me pregunto si tiene algo que ver con el hecho de que estoy usando el Ruby "incorporado" (creo) en lugar de cualquier otra cosa: |
rogerdpack
6

Fingir gemprefijando las variables de entorno apropiadas. Si estaba instalando desde MacPorts, debería poder seguir el siguiente procedimiento:

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

A partir de ahí, tire de la LIBDIR, INCLUDEDIR, CPPFLAGS, LIBSy LDFLAGS(el que creo que va a tener que correr es LIBDIR, sin embargo). Entonces correrás:

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

Eso debería hacerlo por ti. Avísame si no es así.

Sean
fuente
Utilicé el instalador de un clic en lugar de MacPorts para PostgreSQL. No sé cuál sería el comando equivalente.
Jason Swett
Vea si tiene suerte con esto (creo que el script actualizadob de Mac se ejecuta el sábado por la noche):locate pg_config
Sean
Todavía no sé lo que eso significaría para CPPFLAGSo LDFLAGS(no sé lo que son, lo siento).
Jason Swett
Ah, pero locate pg_configme enseñó algunas cosas, sin embargo. E intenté simplemente instalar PostgreSQL a través de MacPorts y usar su comando, no funcionó.
Jason Swett
1
Actualizado el ejemplo anterior. Creo que esto resolverá tu problema. El problema era que LDFLAGSno estaba configurado en el directorio que contenía libpq. Ver arriba para más detalles.
Sean
5

El problema que tuvimos fue bastante extraño.

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

pero cuando hicimos la instalación de un paquete, de hecho, el paquete no se instaló para la versión de ruby ​​que instaló rbenv, por lo tanto, cuando escribimos la instalación del paquete, usó el paquete del sistema.

Entonces, antes de ejecutar la instalación del paquete, asegúrese de haber instalado el paquete ejecutando

gem install bundler
Tibastral
fuente
Esto funcionó en mi caso (macOS High Sierra nuevo, usando rbenv e instalando principalmente con brew). Bundle probablemente usaba cosas de apple, ese era el problema ...
saza
3

No creo que necesite los archivos de desarrollo de Postgres, todo lo que necesita debería haber sido incluido con su instalador. Es más probable que la ruta en la que están instalados no esté en la ruta de su entorno y, por lo tanto, gem no puede encontrarlos cuando intenta compilar pg.

No debería tener que ejecutarse gem install pgcomo root, de hecho, si lo hace, es probable que su RUTA (la RUTA de la raíz si se ejecuta con sudo) no contenga la información necesaria.

Lo siguiente generalmente funciona para mí:

# 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
fuente
Ejecutar gem install pg(junto con sus dos comandos anteriores) en lugar de sudo gem install pgseguir dando exactamente los mismos resultados.
Jason Swett
¿Estás en una arquitectura de 32 o 64 bits? ¿Has probado lo anterior con la otra bandera de arquitectura? ¿También cambiaste /Library/PostgreSQL/...a la ubicación correcta de donde esté tu copia de la instalación de Postgres?
Brett Bender
Miré en mis notas sobre hacer los comandos que enumeré. Parece que instalé Postgres a través de sudo port install postgresql83 postgresql83-server, similar a estas instrucciones: flux88.com/2010/06/installing-postgresql-for-rails-on-mac-os-x . Parece que el instalador independiente es de 32 bits, por lo que desea establecer sus indicadores de arco en 32 bits, incluso si su máquina es de 64 bits. Si no puede hacer que funcione, le sugiero que desinstale y vuelva a instalar a través de MacPorts y luego intente las instrucciones anteriores. ¡Espero que ayude!
Brett Bender
3

Esto es lo que finalmente lo hizo por mí (combinación de múltiples soluciones proporcionadas anteriormente junto con otras publicaciones):

$ sudo env ARCHFLAGS = "- arch x86_64" instalación de gemas pg - with-pg-include = / Library / PostgreSQL / 9.6 / include /

Marcus Silveira
fuente
La solución anterior funcionó para mí en 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 Localice la ruta exacta para la carpeta de inclusión y actualícela en consecuencia.
maniempire el
1

La ARCHFLAGSrespuesta que otros han propuesto no funcionará si de alguna manera terminaste con una versión de 64 bits de postgres (que se instalará homebrew) y una versión de rubí de 32 bits. Por alguna razón rbenvinsiste en construir Ruby 1.9.2-p290 como 32 bits para mí, lo que hace que sea imposible vincular contra los postgres de 64 bits.

Verifique la arquitectura de su binario ruby ​​con

file `which ruby`

o si usa rbenv

file `rbenv which ruby`

Y compara con tus postgres:

file `which postgres`

Si hay una falta de coincidencia, deberá volver a instalar postgres o ruby. Con rbenv resolví esto simplemente cambiando a una versión diferente: en 1.9.3-p194lugar de 1.9.2-p290.

Leopd
fuente
1

Así es como llegué a trabajar en Mavericks. Nota: ya había instalado postgresql 9.3 desde homebrew.

  1. Actualice Xcode a 5.0 desde App Store

  2. Instalar herramientas de desarrollo de línea de comandos

    xcode-select --instalar

  3. Aceptar la licencia de Xcode

    sudo xcodebuild -license

  4. Instalar gema

    ARCHFLAGS = "- arch x86_64" gema instalar pg

Michał Szajbe
fuente
1

Así que básicamente hice esto ;-)

brew install postgres
Jackie Chan
fuente
¿Brew instala el libpq.so (dylib) como su respuesta implica?
Paul-Sebastian Manole
0

Probablemente llego un poco tarde a la fiesta aquí, pero en mi caso estaba usando rbenv y actualizando a Ruby 2.2.3. Tuve que instalar Bundler para que el mío funcionara, tenía una versión anterior del sistema.

gem install bundler

mchapman17
fuente
0

Como se mencionó anteriormente, esto tiene que ver con el hecho de tener dos arcos de rubí en 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]lo que tuve que hacer fue simplemente instalar el arco de pgforzado de gemas x86_64para usarlo con este comando:

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

Recuerda tener tu bash_profileinformación actualizada

Agregue la ruta de sus postgres, en este caso estoy usando la aplicación Postgres ( OSX) en lugar de brew( https://postgresapp.com/ ) por defecto, esta es la ubicación:

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

Recargar bash con

sudo vi ~/.bash_profile

Después de hacer esto, finalmente pude instalar con éxito pg gem

¡Espero que esto ayude!

d1jhoni1b
fuente
0

En Mac puedes probar esto (funciona para mí): gem install pg - with-pg-include = / Library / PostgreSQL / 9.5 / include Fetching: pg-1.0.0.gem (100%) Construyendo extensiones nativas con: ' with-pg-include = / Library / PostgreSQL / 9.5 / include 'Esto podría llevar un tiempo ... Instalado correctamente pg-1.0.0 Analizando la documentación para pg-1.0.0 Instalando la documentación de ri para pg-1.0.0 Realizando la instalación de la documentación por pg después de 3 segundos 1 gema instalada

(esta parte "/Library/PostgreSQL/9.5/include" debe poner su ruta de Postgres)

Marcos Riveros
fuente