LD_LIBRARY_PATH vs建立时间参数

问题描述

我正在使用OpenGL构建应用程序。我在服务器上安装了多个OpenGL。

我注意到,即使在运行时在Makefile中为OpenGL库指定了链接路径之后,在运行应用程序时,它仍然会在不同位置查找库,从而导致错误

正确的openGL路径是/usr/lib/nvidia-410/

yuqiong@sturfee-dnn:~/sturgRender/assets$ ls  /usr/lib/nvidia-410/ | grep GL
libEGL_nvidia.so.0
libEGL_nvidia.so.410.129
libEGL.so
libEGL.so.1
libEGL.so.410.129
libGLdispatch.so.0
libGL.so
libGL.so.1
libGL.so.410.129
libGLX_indirect.so.0
libGLX_nvidia.so.0
libGLX_nvidia.so.410.129
libGLX.so
libGLX.so.0
libOpenGL.so
libOpenGL.so.0

但是LD_LIBRARY_PATH指向:

yuqiong@sturfee-dnn:~/sturgRender/assets$ echo $LD_LIBRARY_PATH 
/usr/local/torch/lib:/usr/local/tensorrt/lib:/usr/local/caffe/lib/:/usr/local/lib;//usr/local/cuda/lib64:/home/yuqiong/TensorRT-7.0.0.11/lib

这将导致应用程序生成egldisplayError。但是,将LD_LIBRARY_PATH更改为/usr/lib/nvidia-410/之后,此错误消失了。

我怀疑这是因为libEGLlibGLXlibOpenGL是动态加载的。

但是,在另一台计算机上,我使用CMake来构建应用程序,即使LD_LIBRARY_PATH为空,该应用程序仍链接正确的库。

  1. 为什么我需要在一台计算机上指定LD_LIBRARY_PATH而不是另一台计算机?
  2. 有关在何处加载存储在LD_LIBRARY_PATH之类的系统变量中或应用程序本身中的动态库的信息?

解决方法

您需要了解什么是rpath,什么是库搜索路径以及搜索库的规则。

有关rpath和库搜索路径,请检查以下一项:

What's the difference between -rpath and -L?

有关搜索库的规则,请检查以下一项:

https://unix.stackexchange.com/questions/22926/where-do-executables-look-for-shared-objects-at-runtime

基于makefile的构建显然不使用rpath,因此基于搜索顺序,加载程序在其他文件夹中找到库,这会导致问题。基于cmake的构建系统使用rpath或库都安装在默认文件夹中,加载程序会检查该默认文件夹,无论设置如何。

我不想重复其他答案中已经解释的内容。我只是试图引导您正确的路径以阅读更多信息并了解这些设置,那么很明显您为什么会遇到此问题以及如何解决它。