Rma*_*ano 23 shared-library compiling libraries
让我用一个例子来解释这个问题。我在日常工作中使用一些旧程序,例如xfig和pdfedit。
现在,这些程序已经很老了,更新也不是很频繁;我担心有一天,由于缺少某些库或某些不兼容的更新,它们将不再工作。
如果程序很容易编译现在,正在运行的系统上,解决的办法是得心应手:尝试破解了一下源和编译静态---生成的可执行文件将是很大的,不那么有效,但是它会为工作可预见的未来(1)。这似乎是这种情况xfig,我会尽快尝试。
但是,例如,pdfedit依赖于Qt3,此时设置一个系统来编译它是相当复杂的。幸运的是,它现在可以运行,这要归功于它所需的库与任何东西都不冲突。但这在未来可能会改变,所以我想解决这个问题:
如果我在 Ubuntu 上有一个动态的和所有的库,但没有源代码,我怎么能制作一个静态的二进制文件(或类似的东西)?
我四处寻找。一种可能性是statifier (2),但它在地址随机化方面有很多问题,所以这是一个禁忌。非免费版本Ermine似乎有效,但我真的更喜欢开源选项。
另一种可能性是使用 docker 或类似的打包系统。但是我找到的所有教程都非常面向 RedHat;而且,老实说,遵循起来非常复杂。
脚注:
(1) 没那么疯狂。例如,我使用静态 ffmpeg,工作正常,没有任何兼容性问题......
(2)编译statifier,见/sf/ask/1644876621/
Kla*_* D. 21
您可以用另一种更简单的方式解决您的问题:
ldd在您的可执行文件上使用以查看链接库,例如:
$ ldd /bin/bash
linux-vdso.so.1 => (0x00007fffb2fd4000)
libtinfo.so.5 => /lib/x86_64-linux-gnu/libtinfo.so.5 (0x00007fac9ef91000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007fac9ed8d000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fac9e9c6000)
/lib64/ld-linux-x86-64.so.2 (0x00007fac9f1e1000)
Run Code Online (Sandbox Code Playgroud)
然后收集文件夹中的所有库并在运行程序之前设置 LD_LIBRARY_PATH 环境变量以指向此文件夹:
$ LD_LIBRARY_PATH="/opt/my_program/lib" /opt/my_program/start
Run Code Online (Sandbox Code Playgroud)
或者,您可以将 lib 文件夹的条目添加到/etc/ld.so.conf.d/. 但这将在系统范围内应用更改。