Linux - 找不到SO文件

时间:2013-08-31 11:16:50

标签: c++ c linux environment-variables shared-libraries

我有一个需要liblog4cpp安装才能运行的程序。

现在,我希望程序在没有liblog4cpp的其他计算机上运行。所以我只找到log4cpp.so并将其移动到我的程序的同一目录。但是在报告运行错误时:

  加载共享库时出现

错误:liblog4cpp.so.4:无法打开   共享对象文件:没有这样的文件或目录

我做得对吗?如何告诉程序找到旁边的SO文件?

6 个答案:

答案 0 :(得分:7)

检查LD_LIBRARY_PATH环境变量...路径上的其中一个目录应指向log4cpp.so文件的位置; linux命令ldd也很方便用于确定可执行文件中使用的共享对象库。语法为ldd <executable>

答案 1 :(得分:7)

除了其他人的建议之外,请考虑将文件添加到动态链接器的缓存中。你可以这样做:

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

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

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

ldconfig -v | grep liblog

答案 2 :(得分:4)

export LD_LIBRARY_PATH到图书馆的路径。这个env变量很像PATH变量。它可以包含多个路径,分隔为:。

答案 3 :(得分:4)

假设.so文件可用的路径为/path,您还可以避免导出环境变量并只使用

LD_LIBRARY_PATH=/path ./myProgram

请注意,如果你这样做:

export LD_LIBRARY_PATH=/path

您正在将LD_LIBRARY_PATH重置为单个值/path并丢失之前添加到此环境变量中的任何内容。如果你想添加一个值而不丢失之前的值

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/path

答案 4 :(得分:3)

在启动程序的rc脚本中,应在启动应用程序之前设置LD_LIBRARAY_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>

知道所以依赖

$ldd <binary_name>

如需进一步了解,请查看以下链接。

http://www.tune2wizard.com/sharedobject-crash/

答案 5 :(得分:2)

将共享对象(或共享库{@ 1}}或此类符号链接)添加到动态链接器ld-linux.so(8)已知的lib*.so*/usr/lib之类的系统目录(或{ {1}})您需要运行ldconfig(8)

您也可以将它们添加到/lib,但请确保ld.so(或某个文件/usr/local/lib/)。显示该目录(并在更改后运行/etc/ld.so.conf