Che*_*r96 7 compiling libraries dependencies
当我编译一个.dll
依赖于 Windows的程序时,将那些带有所需程序的 ddls 复制到另一台 PC 并将这些 DLL 放在程序目录中就足够了。
现在这是我的问题:我已经使用 clang 和 clang++ 用 Ubuntu 编译了一个程序,当我将编译的程序传输到我的服务器 (CentOS) 时,由于缺少库,该程序无法加载。我想将我的库从我的电脑转移到服务器,但我不知道是否可行。
我无法在该服务器中安装程序,因为我没有 root 密码,那么有没有办法解决这个问题?
.so
随意将文件复制到系统范围内的目录不是一个好习惯,因为它会将共享库复制到目标系统而没有包系统控制意识,因此它可能会导致与已安装的软件发生冲突,并且可能缺少其他您无法轻松手动映射的依赖项。
您的里程可能会有所不同,但您可以寻找三种不同的方法:
第一个是尝试安装必要的软件包,其中包含目标发行版中库的兼容版本。但是,这需要 root,您表示这不是一个选项。在任何情况下,如果这在某个时候变成一个选项,这里有一些提示可以帮助这种方法:ldd you_executable_file
显示特定程序的库依赖项。您可以在提供此类库的发行版中查找软件包(例如,在 Fedora 中,您可以使用它yum provides path_to_required_file
来告诉您需要安装哪些软件包。
第二个是尝试生成一个与发行版无关的可执行文件。为此,您应该在编译软件时使用静态库。通常,您可以在 Linux 中找到大多数库的共享 (.so) 和静态 (.a) 版本。您应该使用静态版本并将它们链接起来,就好像它们是目标文件 (.o)。不利的一面是生成的二进制文件将比使用共享库时大得多,因为它将在其自身中携带所有库代码。此外,它不会对稍后安装在系统中的那些库中的错误修复敏感(这将需要使用新的修复版本重新编译您的程序)。
第三个选项确实是将库复制到新系统(即使不是 root)到您的主目录下的目录,并使用LD_LIBRARY_PATH
和/或LD_PRELOAD
环境变量强制动态链接器使用您的库副本。请注意,您可能需要复制许多库(您将使用ldd
我上面提到的命令发现这些库)。 LD_LIBRARY_PATH
告诉动态链接器查看其他路径以查找丢失的库。 LD_PRELOAD
强制动态链接器预加载覆盖系统范围版本的库的特定版本。