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 回答
找到了可接受的解决方法 .
我一直在为此奋斗了整整两天......直到今天下午我发布这个,现在我今晚找到了解释和解决方法 . 我看到的最有用的链接是https://bugs.launchpad.net/ubuntu/+source/xorg/+bug/366728/comments/17
基本上,X11中的ssh init进程会重置LD_LIBRARY_PATH和NLSPATH,因此从窗口管理器启动的程序和终端(它们不是login-shell)会发现这些变量为空 . 解决方案是在X11重置之前导出它们:
变量LD_LIBRARY_PATH:
变量NLSPATH:
我发现真正引人注目的一点是,自2009年以来,这是一个问题/错误,现在没有标准的解决方案 .