6

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

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

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

我做对了吗?我怎样才能告诉程序找到它旁边的 SO 文件?

4

6 回答 6

8

检查您的 LD_LIBRARY_PATH 环境变量...路径上的目录之一应指向log4cpp.so文件的位置;linux 命令ldd还可以方便地确定可执行文件中正在使用哪些共享对象库。语法是ldd <executable>.

于 2013-08-31T11:22:39.160 回答
8

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

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

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

然后为了验证它是否被正确添加,运行这个:

ldconfig -v | grep liblog
于 2013-08-31T11:28:29.317 回答
6

假设.so文件/s可用的路径是/path您也可以避免导出环境变量而只使用

LD_LIBRARY_PATH=/path ./myProgram

请注意,如果您这样做:

export LD_LIBRARY_PATH=/path

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

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/path
于 2013-08-31T14:17:41.537 回答
4

在启动程序的 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>

了解 so 依赖关系

$ldd <binary_name>

更多信息,请查看以下链接。

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

于 2013-08-31T16:03:15.007 回答
4

export LD_LIBRARY_PATH到图书馆的路径。此环境变量的工作方式与 PATH 变量非常相似。它可以包含多个由:分隔的路径。

于 2013-08-31T11:20:35.523 回答
2

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

您也可以将它们添加到/usr/local/lib/但然后确保/etc/ld.so.conf(或某些文件/etc/ld.so.conf.d/*.conf).mentions 该目录(并ldconfig在更改后运行)

于 2013-08-31T11:28:56.287 回答