将libpq.5.dylib复制到/usr/lib/libpq.5.dylib

mnemlml8  于 2023-02-17  发布在  其他
关注(0)|答案(3)|浏览(225)

我无法在R中加载包,因为文件libpq.5.dylib不在/usr/lib/libpq.5.dylib中。它在/usr/local/Cellar/libpq/13.0/lib/libpq.5.dylib
我试过这句话:sudo ln -s /usr/local/Cellar/libpq/13.0/lib/libpq.5.dylib /usr/lib/libpq.5.dylib,但我得到了以下响应:ln: /usr/lib/libpq.5.dylib: Operation not permitted
如何才能在/usr/lib/libpq.5.dylib中获取文件而不引起问题?solution表明我可能会遇到问题,所以我不知道该怎么做。

taor4pac

taor4pac1#

你真的不希望它出现在/usr/lib中。苹果宣布这是一个禁区,在新的macOS版本中,它存在于一个只读卷上。除非你愿意进入恢复模式,手动篡改卷(并可能在未来的操作系统更新中重复),否则这不是一个好办法。
相反,让我们来解决核心问题:
macOS上的动态库将自己的安装路径嵌入到二进制文件中,链接器将其复制到与之链接的二进制文件中。此信息可以使用install_name_tool进行更改(请参阅man install_name_tool)。
1.检查dylib的安装名称:

otool -l /usr/local/Cellar/libpq/13.0/lib/libpq.5.dylib | fgrep -A2 LC_ID_DYLIB

如果打印的路径已经指向dylib本身(或符号链接到它的路径),请将此路径用作下面的[new_path],并跳过步骤2。
1.如果dylib的安装名 * 没有 * 指向自身,运行以下命令:

sudo install_name_tool -id /usr/local/Cellar/libpq/13.0/lib/libpq.5.dylib /usr/local/Cellar/libpq/13.0/lib/libpq.5.dylib

并将/usr/local/Cellar/libpq/13.0/lib/libpq.5.dylib用于下面的[new_path]
1.对于链接到dylib的二进制文件,请运行:

sudo install_name_tool -change /usr/lib/libpq.5.dylib [new_path] [path_to_binary]
vkc1a9a2

vkc1a9a22#

我在通过Docker构建用于API的容器时遇到了同样的问题用途:RPostgres已经安装,但是库不能加载,同样的错误信息。因为我已经在我的机器上安装了Postgres,我想这个问题已经解决了,所以我在本地没有这样的信息;但以下是我如何在我的dockerfile中解决这个问题的,在没有安装任何与R相关的机器上进行了100%验证:

RUN apt-get update && apt-get install libpq5 -y

所以在终端上执行apt-get update && apt-get install libpq5 -y应该可以达到目的,轻便而高效。

sf6xfgos

sf6xfgos3#

它试图从符号链接/opt/homebrew/opt/postgresql/lib/libpq.5.dylib加载libpq.5.dylib,但找不到文件,因此您需要更新它:

# TODO: get this from the error, after "Library not loaded:"
SYMLINK_PATH="/opt/homebrew/opt/postgresql/lib/libpq.5.dylib"

# TODO: find this in your machine. The version maybe different than mine
DESTINATION_PATH="/opt/homebrew/opt/postgresql/lib/postgresql@14/libpq.5.dylib"

sudo mv $SYMLINK_PATH $SYMLINK_PATH.old
sudo ln -s $DESTINATION_PATH $SYMLINK_PATH

相关问题