【问题标题】:LD_LIBRARY_PATH vs build time argumentLD_LIBRARY_PATH 与构建时间参数
【发布时间】:2020-12-06 04:50:21
【问题描述】:

我正在使用 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)中还是存储在应用程序本身中?

【问题讨论】:

  • 有人在我发表评论之前进行了编辑,但只是一个友好的提醒,以供将来参考:明确要求异地资源off-topic。以后请尽量避免这种情况。
  • @Chipster 当然。感谢您的有用评论!

标签: c++ opengl makefile cmake build


【解决方案1】:

你需要了解什么是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,要么库安装在默认文件夹中,无论设置如何,加载程序都会检查。

我不想重复其他答案中已经解释过的内容。我只是想引导您正确地阅读更多内容并了解这些设置,那么您遇到问题的原因以及如何解决它就会很明显。

【讨论】:

  • 是的,这正是我需要知道的!感谢重定向。很有帮助。
猜你喜欢
  • 1970-01-01
  • 2011-04-30
  • 1970-01-01
  • 2011-05-14
  • 2013-08-16
  • 1970-01-01
  • 2010-10-15
  • 1970-01-01
相关资源
最近更新 更多