c++ - 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/
,此错误消失了。
我怀疑这是因为libEGL
and是动态加载的libGLX
。libOpenGL
但是,在另一台机器上,我使用 构建应用程序CMake
,即使LD_LIBRARY_PATH
是空的,应用程序仍然链接正确的库。
- 为什么我需要
LD_LIBRARY_PATH
在一台机器上指定而不在另一台机器上指定? - 有关在何处加载动态库的信息是存储在系统变量中
LD_LIBRARY_PATH
,还是存储在应用程序本身中?
解决方案
您需要了解什么是rpath,什么是库搜索路径以及搜索库的规则。
对于 rpath 和库搜索路径,请检查这个:
有关搜索库的规则,请查看以下规则:
基于 makefile 的构建显然不使用 rpath,因此基于搜索顺序,加载程序在其他文件夹中找到库并导致问题。基于 cmake 的构建系统要么使用 rpath,要么库安装在加载程序检查的默认文件夹中,而不管设置如何。
我不想重复其他答案中已经解释的内容。我只是想引导您正确阅读更多内容并了解这些设置,然后您会遇到问题的原因以及如何解决问题就很明显了。
推荐阅读
- redux - REDUX - 如何导入返回 Promise 的 API 函数并将其添加到动作创建器的有效负载中
- php - 使用 $.post() 方法将图像发送到其他页面
- java - 两个求和 LeetCode Java 问题
- bash - 每 5 分钟获取带有日期戳的文件的 gst 多文件接收器
- database - 知彼启动-MariaDb
- r - R:如何与 NA 值聚合
- android - 如何在 Android Studio 中为 android 2.3 构建应用程序
- python - Python Pandas DataFrame 产生一个 keyerror
- ios - 如何访问导航窗格(左窗格)中创建的文件夹的路径?
- symfony - Symfony3 配置组件验证