首页 > 解决方案 > LD_LIBRARY_PATH 与构建时间参数

问题描述

我正在使用 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/,此错误消失了。

我怀疑这是因为libEGLand是动态加载的libGLXlibOpenGL

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

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

标签: c++openglmakefilecmakebuild

解决方案


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

对于 rpath 和库搜索路径,请检查这个:

-rpath 和 -L 有什么区别?

有关搜索库的规则,请查看以下规则:

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

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

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


推荐阅读