Ank*_*lok 7 libraries dynamic-linking postgresql shared-library
我试图让 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)
Run Code Online (Sandbox Code Playgroud)
对于一堆依赖项,我看到它们的路径不存在。我猜这是因为我不是在构建 postgis,而是在复制所需的 so 和 libs 以使其手动工作。但我确实知道 postgis 所需的那些 so 文件的路径。我应该怎么做才能将依赖项中的“未找到”更改为 postgis 所需的路径?
tre*_*esf 10
许多教程已经部分介绍了这一点,但我觉得许多解决方案都缺少基本示例。
patchelf
可以在Linux 上完成此操作。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
Run Code Online (Sandbox Code Playgroud)
替换所需库的路径:
patchelf --replace-needed ../libsomething1.so /foo/bar/libsomething1.so mysharedobject.so
Run Code Online (Sandbox Code Playgroud)
测试新路径:
patchelf --print-needed mysharedobject.so
# outputs:
/foo/bar/libsomething1.so
libsomething2.so.1
Run Code Online (Sandbox Code Playgroud)
注意:许多教程推荐另一个名为 的工具chrpath
,它可以帮助.so
设置了属性的文件rpath
,但它似乎不适用于缺少 rpath 的库,也无法更改绝对链接位置。
ld.so
动态链接器在执行时查找要链接的共享库时,将使用PATH
-like 环境变量LD_LIBRARY_PATH
。
您可以设置LD_LIBRARY_PATH
为:
链接器应在其中查找库的目录的-delimited 列表,例如:
$ env LD_LIBRARY_PATH="$HOME/local/lib:/opt/other/lib" ./myprog
Run Code Online (Sandbox Code Playgroud)
有关ld.so
详细信息,请参阅系统手册。