Linux - 找不到SO文件

8
我有一个需要安装liblog4cpp才能运行的程序。
现在,我想让程序在另一台没有liblog4cpp的机器上运行。所以我只需找到log4cpp.so并将其移动到我的程序相同的目录中即可。但是在运行时报错:

error while loading shared libraries: liblog4cpp.so.4: cannot open shared object file: No such file or directory

我这样做对吗?如何让程序找到其旁边的SO文件?

log4cpp.so 只是指向 liblog4cpp.so.4 的符号链接吗?请使用 file log4cpp.so 命令进行检查。 - lulyon
6个回答

10

除了其他人提出的建议,还可以考虑将该文件添加到动态链接器缓存中。您可以这样做:

ldconfig -l /path/to/lib/liblog4.so.4

要将其添加到加载器缓存中,请使用以下命令:ldconfig

然后,为了验证它是否被正确添加,请运行以下命令:

ldconfig -v | grep liblog

9

请检查您的 LD_LIBRARY_PATH 环境变量...路径中的一个目录应该指向您的 log4cpp.so 文件所在位置;同时,Linux 命令 ldd 可以方便地确定可执行文件中使用的共享对象库。语法为 ldd <executable>


3
"ldd log4cpp.so" 更加具体。 - user2249683

7
假设 .so 文件的路径为 /path,您也可以避免导出环境变量并直接使用。
LD_LIBRARY_PATH=/path ./myProgram

注意,如果您执行以下操作:

export LD_LIBRARY_PATH=/path

您正在将 LD_LIBRARY_PATH 重置为单个值 /path,并且失去了之前添加到此环境变量中的任何内容。如果您想添加一个值而不丢失先前的值,请按以下方式操作:
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/path

6

如果您是从rc脚本启动程序,请在启动应用程序之前设置LD_LIBRARY_PATH。请记住,.so是共享库,在运行时需要进行链接。因此,在启动之前应该在标准路径(如/usr/lib)中可用。 如果未复制到标准路径(如/usr/lib)中,则可以使用以下方法指定路径。

export LD_LIBRARY_PATH=<new_path_of_so>:$(LD_LIBRARY_PATH)

理想情况下,我会将这个 .so 文件放在标准路径(如 /usr/lib)中。如果安装在标准路径中,则无需设置上述路径。记住,为了使您的程序更好,将新路径添加到 ldconfig.conf 中。
您可以使用以下方法调试此类错误。
$strace <binary_name>

了解 SO 依赖性
$ldd <binary_name>

请查看下面的链接,获取更多信息。 http://www.tune2wizard.com/sharedobject-crash/

4

export LD_LIBRARY_PATH 将库的路径设置为环境变量。这个环境变量和“PATH”环境变量很相似。它可以包含多个由冒号分隔的路径。


2
将共享对象(或共享库 lib*.so* 或此类符号链接) 添加到系统目录(如 /usr/lib/lib),这些目录已知动态链接器 ld-linux.so(8) (或 ld.so),需要运行 ldconfig(8)
您也可以将它们添加到 /usr/local/lib/,但是请确保 /etc/ld.so.conf (或某个文件 /etc/ld.so.conf.d/*.conf) 中提到了该目录(并在更改后运行 ldconfig)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接