Скомпилируйте postgres ruby gem с libpq.a на 10.6.7

#ruby #postgresql #osx-snow-leopard

#ruby #postgresql #osx-snow-leopard

Вопрос:

Я пытаюсь установить ruby pg gem, используя пользовательскую компиляцию postgres 8.4.7. Это работает, как ожидалось:

 sudo env ARCHFLAGS='-arch x86_64' gem install pg -- --with-pg-config=/path/to/my/pg_config
  

Gem компилируется и устанавливается правильно, а при необходимости загружает нужную динамическую библиотеку.
Тем не менее, я хотел бы статически связать gem для переносимости на нескольких компьютерах. Моя самая разумная попытка:

 sudo env ARCHFLAGS='-arch x86_64' gem install pg -- --with-pg-config=/path/to/my/pg_config --with-ldflags='-static'
  

сбой с этим сообщением об ошибке:

 
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 --with-pg-config=/[edited]/pgsql-8.4.7/bin/pg_config --with-ldflags=-static
checking for /[edited]/pgsql-8.4.7/bin/pg_config... yes
MacOS X build: fixing architecture flags:
  using the value in ARCHFLAGS environment variable ("-arch x86_64").
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)
  

Есть предложения?
Спасибо!

Обновление: из файла mkmf.log:

 
conftest.c: In function ‘t’:
conftest.c:5: error: too few arguments to function ‘PQconnectdb’
checked program was:
/* begin */
1: #include 
2: 
3: /*top*/
4: int main() { return 0; }
5: int t() { PQconnectdb(); return 0; }
/* end */
  

Ответ №1:

Решена:

Скопируйте статические библиотеки Postgres в отдельное местоположение из каталога [prefix] / lib и явно передайте новый путь при сборке gem:

 sudo env ARCHFLAGS='-arch x86_64' gem install pg -- --with-pg-config=/path/to/my/pg_config --with-pg-lib=/path/to/static/libs
  

Подробные сведения:

Важная информация была немного изменена в файле mkmf.log:

 "gcc -o conftest -I. -I/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/universal-darwin10.0 -I.  -D_XOPEN_SOURCE -D_DARWIN_C_SOURCE   -I/[edited]/pgsql-9.0.3/include -arch x86_64 -g -Os -pipe -fno-common -DENABLE_DTRACE  -fno-common  -pipe -fno-common   conftest.c  -L. -L/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib -static -L/[edited]/pgsql-9.0.3/lib     -lruby -lpq  -lpthread -ldl  "
ld: library not found for -lcrt0.o
collect2: ld returned 1 exit status
  

Передача флага ‘-static’ компоновщику пыталась создать полностью статически связанный двоичный файл, который не поддерживается в Mac OS X:

Статическое связывание пользовательских двоичных файлов в Mac OS X

Комментарии:

1. Где находятся эти статические библиотеки? Что искать?

2. @Paul если вы используете пользовательскую компиляцию Postgres, это зависит от вашего пути с префиксом —. Если не уверены, попробуйте запустить инструмент psql, установив переменную окружения DYLD_PRINT_LIBRARIES = 1, это должно дать вам подсказку, откуда загружается ваша установка. Для меня сработало копирование libpq.a в другое место, а затем передача его как параметра —with-pg-lib.