我试图让 postgis 扩展在我的系统上工作,但它总是抛出“$libdir/postgis2.2”没有这样的文件或目录错误。出于好奇,我执行了“ldd postgis-2.2.so”,它输出了以下结果:
linux-vdso.so.1 => (0x00007ffff3bc8000)
/usr/lib64/libjemalloc.so.1 (0x00002b3fe5ff4000)
libgeos_c.so.1 => not found
libproj.so.9 => not found
libjson-c.so.2 => not found
libxml2.so.2 => /usr/lib64/libxml2.so.2 (0x00002b3fe6237000)
libm.so.6 => /lib64/libm.so.6 (0x00002b3fe659e000)
libc.so.6 => /lib64/libc.so.6 (0x00002b3fe689c000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00002b3fe6c41000)
/lib64/ld-linux-x86-64.so.2 (0x00002b3fe5b2e000)
libdl.so.2 => /lib64/libdl.so.2 (0x00002b3fe6e5d000)
libz.so.1 => /lib64/libz.so.1 (0x00002b3fe7061000)
liblzma.so.5 => /usr/lib64/liblzma.so.5 (0x00002b3fe7277000)
对于一堆依赖项,我看到它们的路径不存在。我猜这是因为我没有构建 postgis,而只是复制所需的 so 和库以使其手动工作。但我确实知道postgis所需的那些so文件的路径。我应该怎么做才能将依赖项中的“未找到”更改为postgis所需的路径?
答案1
许多教程已经部分介绍了这一点,但我觉得许多解决方案都缺少基本示例。
- 对于Linux,
patchelf
可以在 Linux 上完成此操作。 - 对于 MacOS,有一个名为
install_name_tool
。
假设您使用的是 Linux:
笔记:
patchelf
许多系统上默认情况下不安装。您可以使用apt install patchelf
、dnf install patchelf
或pacman install patchelf
您的包管理器提供的任何内容来安装它。
patchelf --print-needed mysharedobject.so
# outputs:
../libsomething1.so
libsomething2.so.1
替换所需库的路径:
patchelf --replace-needed ../libsomething1.so /foo/bar/libsomething1.so mysharedobject.so
测试新路径:
patchelf --print-needed mysharedobject.so
# outputs:
/foo/bar/libsomething1.so
libsomething2.so.1
笔记:许多教程推荐了另一个工具,称为chrpath
它可以帮助设置.so
了属性的文件rpath
,但它似乎不适用于缺少 rpath 的库,也无法更改绝对链接位置。
答案2
ld.so
动态链接器在执行时查找要链接的共享库时将使用PATH
-like 环境变量。LD_LIBRARY_PATH
您可以设置LD_LIBRARY_PATH
链接:
器应在其中查找库的以 - 分隔的目录列表,例如:
$ env LD_LIBRARY_PATH="$HOME/local/lib:/opt/other/lib" ./myprog
有关详细信息,请参阅ld.so
系统手册。