首页 文章

Debian Wheezy 7.5 - 在用户会话中未加载变量LD_LIBRARY_PATH

提问于
浏览
1

System: Debian 7.5 Wheezy

大家好!!

Short version :LD_LIBRARY_PATH环境变量未正确加载,但在/etc/profile.d中设置它的脚本似乎正常工作 .

Long version :这些天我已经将这些安装安装到/ opt文件夹中 . 要在安装后设置所需的环境变量,我这样做:

gedit setXXXVariables.sh
    #!/bin/sh
    export VARIABLE=value
    export VARIABLE=$VARIABLE:more_values
sudo install -m755 setXXXVariables.sh /etc/profile.d

所以,我在profile.d中安装了几个脚本:

$ ls -l /etc/profile.d
total 36
-rw-r--r-- 1 root root  660 jun 17  2012 bash_completion.sh
-rwxr-xr-x 1 root root  184 jun  7 14:57 setAndroidNDKVariables.sh
-rwxr-xr-x 1 root root  203 jun  7 14:52 setAndroidSDKVariables.sh
-rwxr-xr-x 1 root root  188 jun 15 11:52 setAntVariables.sh
-rwxr-xr-x 1 root root 2444 jun 15 12:05 setIntelIPPVariables.sh
-rwxr-xr-x 1 root root  508 jun 15 13:15 setOpenCVVariables.sh
-rwxr-xr-x 1 root root  146 jun  7 15:02 setOracleJDKVariables.sh
-rwxr-xr-x 1 root root  241 jun 12 02:04 setQt5Variables.sh
-rwxr-xr-x 1 root root  235 jun 13 17:52 setVTKVariables.sh

每个文件的内容(不包括bash_completion.sh,随系统附带并保持不变)如下:

setAndroidNDKVariables.sh:

#!/bin/sh
export ANDROID_NDK=/opt/AndroidNDK/android-ndk-r9d
export PATH=$PATH:$ANDROID_NDK

setAndroidSDKVariables.sh:

#!/bin/sh
export ANDROID_SDK=/opt/AndroidSDK
export PATH=$PATH:$ANDROID_SDK/tools:$ANDROID_SDK/platform-tools

setAntVariables.sh:

#!/bin/sh
export ANT_HOME=/opt/ApacheAnt/apache-ant-1.9.4
export PATH=${PATH}:${ANT_HOME}/bin

setIntelIPPVariables.sh:

#!/bin/sh 

#RLP 08-06-14: Fichero shell para establecer variables globales de librería Intel IPP (Integrated Performance Primitives) para poder compilar OpenCV con IPP
#/opt/intel/bin/compilervars.sh intel64 

#Por alguna razón la línea anterior no fuciona, así que procedemos a establecer las variables manualmente, tras analizar y comparar las generadas por dicho script
MI_VALOR=/opt/intel/composer_xe_2013_sp1.3.174/ipp/include
if [ -z "${CPATH}" ]
then
   export CPATH=$MI_VALOR
else
   export CPATH=$CPATH:$MI_VALOR    
fi

export INTEL_LICENSE_FILE=/opt/intel/composer_xe_2013_sp1.3.174/licenses:/opt/intel/licenses:$HOME/intel/licenses
export IPPROOT=/opt/intel/composer_xe_2013_sp1.3.174/ipp

MI_VALOR=/opt/intel/composer_xe_2013_sp1.3.174/compiler/lib/intel64:/opt/intel/composer_xe_2013_sp1.3.174/mpirt/lib/intel64:/opt/intel/composer_xe_2013_sp1.3.174/compiler/lib/intel64:/opt/intel/composer_xe_2013_sp1.3.174/ipp/lib/intel64
if [ -z "${LD_LIBRARY_PATH}" ]
then
   export LD_LIBRARY_PATH=$MI_VALOR
else
   export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$MI_VALOR    
fi

MI_VALOR=/opt/intel/composer_xe_2013_sp1.3.174/compiler/lib/intel64:/opt/intel/composer_xe_2013_sp1.3.174/ipp/lib/intel64
if [ -z "${LIBRARY_PATH}" ]
then
   export LIBRARY_PATH=$MI_VALOR
else
   export LIBRARY_PATH=$LIBRARY_PATH:$MI_VALOR  
fi

#export MANPATH=/opt/intel/composer_xe_2013_sp1.3.174/man/en_US:/usr/local/man:/usr/local/share/man:/usr/share/man:
MI_VALOR=/opt/intel/composer_xe_2013_sp1.3.174/man/en_US
if [ -z "${MANPATH}" ]
then
   export MANPATH=$MI_VALOR
else
   export MANPATH=$MANPATH:$MI_VALOR    
fi

MI_VALOR=/opt/intel/composer_xe_2013_sp1.3.174/compiler/lib/mic:/opt/intel/composer_xe_2013_sp1.3.174/mpirt/lib/mic
if [ -z "${MIC_LD_LIBRARY_PATH}" ]
then
   export MIC_LD_LIBRARY_PATH=$MI_VALOR
else
   export MIC_LD_LIBRARY_PATH=$MIC_LD_LIBRARY_PATH:$MI_VALOR    
fi

#Look out for NLSPATH var
MI_VALOR="/opt/intel/composer_xe_2013_sp1.3.174/compiler/lib/intel64/locale/%l_%t/%N:/opt/intel/composer_xe_2013_sp1.3.174/ipp/lib/intel64/locale/%l_%t/%N"
if [ -z "${NLSPATH}" ]
then
   export NLSPATH=$MI_VALOR
else
   export NLSPATH=$NLSPATH:$MI_VALOR    
fi

export PATH=$PATH:/opt/intel/composer_xe_2013_sp1.3.174/bin/intel64:/opt/intel/composer_xe_2013_sp1.3.174/mpirt/bin/intel64

SetOpenCVVariables.sh:

#!/bin/sh

MI_VALOR=/opt/OpenCV/OpenCV-2.4.9/lib/pkgconfig
if [ -z "$PKG_CONFIG_PATH" ]
then
   export PKG_CONFIG_PATH=$MI_VALOR
else
   export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:$MI_VALOR
fi

MI_VALOR=/opt/OpenCV/OpenCV-2.4.9/lib
if [ -z "$LD_LIBRARY_PATH" ]
then
   export LD_LIBRARY_PATH=$MI_VALOR
else
   export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$MI_VALOR
fi

setOracleJDKVariables.sh:

#!/bin/sh
export JAVA_HOME=/opt/OracleJDK/jdk1.8.0_05

setQt5Variables.sh:

#!/bin/sh
export QT5=/opt/Qt/5.3/gcc_64/bin
export PATH=$PATH:$QT5
export QT_QMAKE_EXECUTABLE=/opt/Qt/5.3/gcc_64/bin/qmake

SetVTKVariables.sh:

#!/bin/sh 
export VTK_DIR=/opt/VTK/VTK-6.1

但是某些变量,特别是LD_LIBRARY_PATH没有正确加载 .

为了测试这个,我在$ HOME文件夹中创建了这个脚本:

echo "CPATH:"; echo $CPATH
echo "INTEL_LICENSE_FILE:"; echo $INTEL_LICENSE_FILE
echo "IPPROOT:"; echo $IPPROOT
echo "LD_LIBRARY_PATH:"; echo $LD_LIBRARY_PATH
echo "LIBRARY_PATH:"; echo $LIBRARY_PATH
echo "MANPATH:"; echo $MANPATH
echo "IC_LD_LIBRARY_PATH:"; echo $MIC_LD_LIBRARY_PATH
echo "NLSPATH:"; echo $NLSPATH
echo "PATH:"; echo $PATH
echo "PKG_CONFIG_PATH:"; echo $PKG_CONFIG_PATH
echo "JAVA_HOME:"; echo $JAVA_HOME 
echo "QT5:"; echo $QT5
echo "QT_QMAKE_EXECUTABLE:"; echo $QT_QMAKE_EXECUTABLE
echo "VTK_DIR:"; echo $VTK_DIR

现在,我登录默认GUI(Gnome 3),打开终端窗口,然后执行此脚本以查看值:

./printMyEnvs.sh

CPATH: /opt/intel/composer_xe_2013_sp1.3.174/ipp/include

INTEL_LICENSE_FILE: /opt/intel/composer_xe_2013_sp1.3.174/licenses:/opt/intel/licenses:/home/rlp/intel/licenses

IPPROOT: /opt/intel/composer_xe_2013_sp1.3.174/ipp

LD_LIBRARY_PATH:

LIBRARY_PATH: /opt/intel/composer_xe_2013_sp1.3.174/compiler/lib/intel64:/opt/intel/composer_xe_2013_sp1.3.174/ipp/lib/intel64

MANPATH: /opt/intel/composer_xe_2013_sp1.3.174/man/en_US

IC_LD_LIBRARY_PATH: /opt/intel/composer_xe_2013_sp1.3.174/compiler/lib/mic:/opt/intel/composer_xe_2013_sp1.3.174/mpirt/lib/mic

NLSPATH:

PATH: / usr / local / bin:/ usr / bin:/ bin:/ usr / local / games:/ usr / games:/ opt / AndroidNDK / android-ndk-r9d:/ opt / AndroidSDK / tools:/ opt / AndroidSDK /platform-tools:/opt/ApacheAnt/apache-ant-1.9.4/bin:/opt/intel/composer_xe_2013_sp1.3.174/bin/intel64:/opt/intel/composer_xe_2013_sp1.3.174/mpirt/bin/intel64:/opt /Qt/5.3/gcc_64/bin

PKG_CONFIG_PATH: /opt/OpenCV/OpenCV-2.4.9/lib/pkgconfig

JAVA_HOME: /opt/OracleJDK/jdk1.8.0_05 QT5: /opt/Qt/5.3/gcc_64/bin

QT_QMAKE_EXECUTABLE: /opt/Qt/5.3/gcc_64/bin/qmake

VTK_DIR: /opt/VTK/VTK-6.1

请注意,未正确设置NLSPATH和LD_LIBARY_PATH .

现在,如果我进入纯登录shell(CRTL F1打开纯登录shell模式)):

./printMyEnvs.sh

CPATH: /opt/intel/composer_xe_2013_sp1.3.174/ipp/include

INTEL_LICENSE_FILE: /opt/intel/composer_xe_2013_sp1.3.174/licenses:/opt/intel/licenses:/home/rlp/intel/licenses

IPPROOT: /opt/intel/composer_xe_2013_sp1.3.174/ipp

LD_LIBRARY_PATH: /opt/intel/composer_xe_2013_sp1.3.174/compiler/lib/intel64:/opt/intel/composer_xe_2013_sp1.3.174/mpirt/lib/intel64:/opt/intel/composer_xe_2013_sp1.3.174/compiler/lib/intel64:/opt/intel /composer_xe_2013_sp1.3.174/ipp/lib/intel64:/opt/OpenCV/OpenCV-2.4.9/lib

LIBRARY_PATH: /opt/intel/composer_xe_2013_sp1.3.174/compiler/lib/intel64:/opt/intel/composer_xe_2013_sp1.3.174/ipp/lib/intel64

MANPATH: /opt/intel/composer_xe_2013_sp1.3.174/man/en_US

IC_LD_LIBRARY_PATH: /opt/intel/composer_xe_2013_sp1.3.174/compiler/lib/mic:/opt/intel/composer_xe_2013_sp1.3.174/mpirt/lib/mic

NLSPATH: /opt/intel/composer_xe_2013_sp1.3.174/compiler/lib/intel64/locale/%l_%t/%N:/opt/intel/composer_xe_2013_sp1.3.174/ipp/lib/intel64/locale/%l_%t/%N

PATH: / usr / local / bin:/ usr / bin:/ bin:/ usr / local / games:/ usr / games:/ opt / AndroidNDK / android-ndk-r9d:/ opt / AndroidSDK / tools:/ opt / AndroidSDK /platform-tools:/opt/ApacheAnt/apache-ant-1.9.4/bin:/opt/intel/composer_xe_2013_sp1.3.174/bin/intel64:/opt/intel/composer_xe_2013_sp1.3.174/mpirt/bin/intel64:/opt /Qt/5.3/gcc_64/bin

PKG_CONFIG_PATH: /opt/OpenCV/OpenCV-2.4.9/lib/pkgconfig

JAVA_HOME: /opt/OracleJDK/jdk1.8.0_05 QT5: /opt/Qt/5.3/gcc_64/bin

QT_QMAKE_EXECUTABLE: /opt/Qt/5.3/gcc_64/bin/qmake

VTK_DIR: /opt/VTK/VTK-6.1

如您所见,现在所有变量都已正确设置!! Why aren't LD_LIBRARY_PATH and NLSPATH set when I open Terminal window in Gnome?

有人可能会说Debian /etc/profile.d不是导出变量的好地方,但其他的都可以......


编辑:

如果我将重新定义LD_LIBRARY_PATH的行添加到/ etc / profile,结果与上面描述的相同(shell登录中的变量OK,图形终端中的Empty) . 这是有道理的,因为/ etc / profile仅在创建登录shell时执行 . 但其他变量在终端Windows中正确加载...

系统是否以某种特殊方式管理LD_LIBRARY_PATH?


编辑2:

如果打开终端窗口并强制它以登录方式进入:

sudo login

完成后,我可以看到所有的vars,包括LD_LIBRARY_PATH . 所以,这是一个关于“login-shell”与“non login-shell”的问题......但这没有任何意义,因为有些vars被加载而有些则没有 . 感到困惑......

1 回答

  • 3

    找到了可接受的解决方法 .

    我一直在为此奋斗了整整两天......直到今天下午我发布这个,现在我今晚找到了解释和解决方法 . 我看到的最有用的链接是https://bugs.launchpad.net/ubuntu/+source/xorg/+bug/366728/comments/17

    基本上,X11中的ssh init进程会重置LD_LIBRARY_PATH和NLSPATH,因此从窗口管理器启动的程序和终端(它们不是login-shell)会发现这些变量为空 . 解决方案是在X11重置之前导出它们:

    变量LD_LIBRARY_PATH:

    sudo gedit /etc/X11/Xsession.d/89preserve_ld_library_path
    
    #RLP 15-06-2014: workaround to get LD_LIBRARY_PATH exported (mainly for OpenCV and Intel IPP libraries, and future others)
    STARTUP="/usr/bin/env LD_LIBRARY_PATH=${LD_LIBRARY_PATH} ${STARTUP}"
    

    变量NLSPATH:

    sudo gedit /etc/X11/Xsession.d/89preserve_nlspath
    
    #RLP 15-06-2014: workaround to get NLSPATH exported (mainly for Intel IPP library)
    STARTUP="/usr/bin/env NLSPATH=${NLSPATH} ${STARTUP}"
    

    我发现真正引人注目的一点是,自2009年以来,这是一个问题/错误,现在没有标准的解决方案 .

相关问题