Ruby 'pg' gem, связанный с неправильной копией libpq.5.dylib(в OSX)

Установщик EnterpriseDB для PostgreSQL 9.3 помещает свои файлы в /Library/PostgreSQL/9.3/* на Mac OSX. Тем не менее, Ruby gem "pg" загружает устаревшую версию динамической библиотеки "C" libpq.5.dylib из /usr/lib вместо правильной версии из /Library/PostgreSQL/9.3/lib. Это происходит, несмотря на то, что я установил драгоценный камень с помощью

gem install pg -- --with-pg-config=/Library/PostgreSQL/9.3/bin/pg_config

Я определил, какая версия libpq.5.dylib загружается установкой переменной окружения DYLD_PRINT_LIBRARIES, перед тем, как требовать жемчуг 'pg'.

Наиболее очевидным следствием связывания с неправильной динамической библиотекой является то, что gem не может подключиться к базе данных с помощью сокета домена, поскольку сокет был перемещен между версиями от /var/pgsql_socket до /tmp. Однако ссылка на старую библиотеку также может вызывать другие проблемы.

Любые предложения по устранению этой проблемы?

(Я запускаю Mac OSX Lion. Примечание: для большинства pg-библиотек установщик EnterpriseDB ставит статическую (.a) и динамическую (.dylib) версию в /Library/PostgreSQL/9.3/lib, но только для libpq.5 динамическая версия.)

Ответ 1

Как причина проблемы, так и простое решение стали очевидными, когда я запускал bin/pg_config в командной строке.

pg_config генерирует переменные, которые используются для управления компиляцией и компоновкой. Особый интерес представляют LIBDIR и LDFLAGS. LIBDIR определяет местоположение для статических библиотек, в то время как LDFLAGS предоставляет места для поиска динамических библиотек. В моей системе LIBDIR был правильно установлен на /LibraryPostgreSQL/9.3/lib, но LDFLAGS был установлен следующим образом:

LDFLAGS = -L../../../src/common -L/usr/local/lib -L/opt/local/20140109/lib -Wl,-dead-strip-dylibs

Так как libpq.5.dylib не присутствовал ни в одном из этих мест, камень не смог его найти и вместо этого нашел более старую версию, которая была установлена ​​в /usr/lib.

Один из способов исправить это - это ввести правильное местоположение файла в LDFLAGS, возможно, изменив код в extconf.rb, который генерирует файл конфигурации. Однако гораздо проще исправить в этом случае просто добавить символическую ссылку в /usr/local/lib в правильное расположение файла:

/usr/local/lib> ln -s /Library/PostgreSQL/9.3/lib/libpq.5.dylib libpq.5.dylib

Если вы столкнулись с подобной проблемой, просто просмотрите вывод pg_config и посмотрите, можете ли вы поместить символическую ссылку в правильное расположение файла в одном из каталогов, которые уже указаны LDFLAGS.