Ubuntu下zshrc中部分LD_LIBRARY_PATH设置未生效问题咨询
zshrc中LD_LIBRARY_PATH配置失效问题排查
问题描述
在Ubuntu系统的zshrc中配置LD_LIBRARY_PATH时,ROS和CUDA相关的路径无法生效。执行echo ${LD_LIBRARY_PATH}后,仅显示Isaac Gym注释后的路径配置,ROS和CUDA的配置完全消失。将ROS和CUDA的代码段移到Isaac Gym配置之后,所有路径都能正常显示。
原始zshrc配置片段
# ros source /opt/ros/noetic/setup.zsh export LD_LIBRARY_PATH=/usr/lib/x86_64-linux-gnu/:$LD_LIBRARY_PATH # cuda export CUDA_HOME=$CUDA_HOME:/usr/local/cuda-11.2 export LD_LIBRARY_PATH=/usr/local/cuda-11.2/lib64${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}} export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:/usr/local/cuda-11.2/lib64 # isaac gym export VK_ICD_FILENAMES=/usr/share/vulkan/icd.d/nvidia_icd.json export LD_LIBRARY_PATH=/home/xzc/mambaforge/envs/mvp/lib # mujoco export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:/home/xzc/.mujoco/mujoco200/bin export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:/home/xzc/.mujoco/mujoco210/bin export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:/home/xzc/.mujoco/mujoco211/bin export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:/home/xzc/.mujoco/mujoco214/bin export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:/usr/lib/nvidia export LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libGLEW.so
执行echo ${LD_LIBRARY_PATH}的输出
/home/xzc/mambaforge/envs/mvp/lib: /home/xzc/.mujoco/mujoco200/bin: /home/xzc/.mujoco/mujoco210/bin: /home/xzc/.mujoco/mujoco211/bin: /home/xzc/.mujoco/mujoco214/bin:/usr/lib/nvidia
原因分析
zshrc是从上到下逐行执行的,环境变量的赋值会直接覆盖原有内容:
- ROS和CUDA部分的配置都是采用追加模式(比如
$LD_LIBRARY_PATH或${LD_LIBRARY_PATH:+:...}),会保留之前的路径并添加新路径。 - 但Isaac Gym的配置是直接赋值:
export LD_LIBRARY_PATH=/home/xzc/mambaforge/envs/mvp/lib,这会完全清空之前所有的LD_LIBRARY_PATH内容,把它替换成这个单一路径。后续Mujoco等配置都是在这个被清空后的基础上追加,所以之前的ROS和CUDA路径完全丢失。
当把ROS和CUDA代码段移到Isaac Gym之后,它们的追加操作是在Isaac Gym的路径基础上添加,所以所有路径都会被保留。
解决方案
将Isaac Gym的LD_LIBRARY_PATH配置改为追加模式,根据需求选择以下两种方式之一:
- 把Isaac Gym的路径放在现有路径的前面:
export LD_LIBRARY_PATH=/home/xzc/mambaforge/envs/mvp/lib${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}
(${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}的作用是:如果LD_LIBRARY_PATH已有内容,就添加冒号和原有内容;如果为空则只保留新路径)
- 把Isaac Gym的路径放在现有路径的后面:
export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:/home/xzc/mambaforge/envs/mvp/lib
修改后重新加载zshrc(source ~/.zshrc),再执行echo ${LD_LIBRARY_PATH}就能看到所有路径了。
内容的提问来源于stack exchange,提问作者KKKmelody
相关产品推荐
相关产品推荐

