Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby';pg';gem链接到错误的libpq.5.dylib副本(在OSX上)_Ruby_Macos_Postgresql_Gem - Fatal编程技术网

Ruby';pg';gem链接到错误的libpq.5.dylib副本(在OSX上)

Ruby';pg';gem链接到错误的libpq.5.dylib副本(在OSX上),ruby,macos,postgresql,gem,Ruby,Macos,Postgresql,Gem,EnterpriseDB PostgreSQL 9.3安装程序将其文件放在Mac OSX上的/Library/PostgreSQL/9.3/*中。但是,Ruby gem“pg”从/usr/lib加载“C”动态库libpq.5.dylib的旧版本,而不是使用/library/PostgreSQL/9.3/lib的正确版本。尽管我已使用安装了gem,但仍会发生这种情况 gem install pg -- --with-pg-config=/Library/PostgreSQL/9.3/bin/pg_

EnterpriseDB PostgreSQL 9.3安装程序将其文件放在Mac OSX上的
/Library/PostgreSQL/9.3/*
中。但是,Ruby gem“pg”从
/usr/lib
加载“C”动态库
libpq.5.dylib
的旧版本,而不是使用
/library/PostgreSQL/9.3/lib
的正确版本。尽管我已使用安装了gem,但仍会发生这种情况

gem install pg -- --with-pg-config=/Library/PostgreSQL/9.3/bin/pg_config
在需要“pg”gem之前,我通过设置DYLD_PRINT_LIBRARIES环境变量来确定加载了哪个版本的
libpq.5.dylib

链接到错误的动态库的最明显后果是gem无法使用域套接字连接到数据库,因为套接字在从
/var/pgsql_socket
/tmp
的版本之间重新定位。但是,链接到旧库也可能导致其他问题

有没有关于如何解决这个问题的建议


(我正在运行Mac OSX Lion。另外注意:对于大多数pg库,EnterpriseDB安装程序在
/Library/PostgreSQL/9.3/lib
中同时安装了静态(.a)和动态(.dylib)版本,但对于
libpq.5
而言,只安装了动态版本。)

当我在命令行上运行
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
在这些位置中的任何一个都不存在,因此gem未能找到它,而是找到了一个较早的版本,该版本恰好安装在
/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已指定的某个目录中的正确文件位置。

works中建议的解决方法;即将环境变量DYLD_LIBRARY_PATH设置为/LIBRARY/PostgreSQL/9.3/lib。然而,我希望有一个更吸引人的解决方案。肖恩对的回答对理解这个问题非常有用,也可能对其他人感兴趣。非常有帮助……我可能最终会发现这一点,但我不会在这上面下太多赌注……我已经扫描了我的pg_配置的输出,没有发现问题。非常感谢。