CDT*_*CDT 4 c c++ linux shared-libraries environment-variables
我有一个程序需要liblog4cpp安装才能运行.
现在,我希望程序在没有的情况下在另一台机器上运行liblog4cpp.所以我只是找到log4cpp.so并将其移动到我的程序的同一目录中.但在报告运行错误时:
加载共享库时出错:liblog4cpp.so.4:无法打开共享对象文件:没有这样的文件或目录
我做得对吗?如何告诉程序找到旁边的SO文件?
除了其他人的建议之外,请考虑将文件添加到动态链接器的缓存中.你可以这样做:
ldconfig -l /path/to/lib/liblog4.so.4
Run Code Online (Sandbox Code Playgroud)
要将其添加到加载程序的缓存,请使用以下命令: ldconfig
然后,为了验证它是否已正确添加,请运行以下命令:
ldconfig -v | grep liblog
Run Code Online (Sandbox Code Playgroud)
检查LD_LIBRARY_PATH环境变量...路径上的一个目录应指向log4cpp.so文件的位置; linux命令ldd也很方便用于确定可执行文件中正在使用哪些共享库.语法是ldd <executable>.
假设.so文件可用的路径是/path您还可以避免导出环境变量而只需使用
LD_LIBRARY_PATH=/path ./myProgram
Run Code Online (Sandbox Code Playgroud)
请注意,如果您这样做:
export LD_LIBRARY_PATH=/path
Run Code Online (Sandbox Code Playgroud)
您正在重置LD_LIBRARY_PATH为单个值/path并丢失您之前添加到此环境变量的任何内容。如果您想添加一个值而不丢失之前的值
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/path
Run Code Online (Sandbox Code Playgroud)
在启动程序的 rc 脚本中,应在启动应用程序之前设置 LD_LIBRARAY_PATH。请记住,.so 是共享库,需要在运行时链接。因此,在启动之前,它应该在 /usr/lib 等标准路径中可用。如果未将其复制到 /usr/lib 等标准路径中,则使用以下命令指定路径。
export LD_LIBRARY_PATH=<new_path_of_so>:$(LD_LIBRARY_PATH)
Run Code Online (Sandbox Code Playgroud)
理想情况下,我会将这个 .so 放在标准路径中,例如 /usr/lib。如果安装在标准路径下,则无需设置上述路径。请记住,为了使您的程序更好,请将新路径放入 ldconfig.conf 中。
您可以使用以下命令调试此类错误。
$strace <binary_name>
Run Code Online (Sandbox Code Playgroud)
了解so的依赖关系
$ldd <binary_name>
Run Code Online (Sandbox Code Playgroud)
如需进一步了解,请检查以下链接。
http://www.tune2wizard.com/sharedobject-crash/
| 归档时间: |
|
| 查看次数: |
9597 次 |
| 最近记录: |