Debian Wheezy 7.5 - Променлива LD_LIBRARY_PATH не се зарежда в потребителски сесии

Система: Debian 7.5 Wheezy

Здравейте всички!!

Кратка версия: Променливата на средата LD_LIBRARY_PATH не е правилно заредена, но скриптовете, които я задават в /etc/profile.d, изглежда работят правилно.

Дълга версия: През тези дни извършвах инсталиране на Qt5 и няколко библиотеки. Направих тези инсталации в папката /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:

ПЪТ_ДО БИБЛИОТЕКАТА: /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:

ПЪТ: /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 не са правилно зададени.

Сега, ако вляза в чиста обвивка за влизане (CRTL+F1 за отваряне на режим на чиста обвивка за влизане):

./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/ компилатор/ lib/intel64:/opt/intel/composer_xe_2013_sp1.3.174/ipp/lib/intel64:/opt/OpenCV/OpenCV-2.4.9/lib

ПЪТ_ДО БИБЛИОТЕКАТА: /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

ПЪТ: /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

Както можете да видите, сега ВСИЧКИ променливи са правилно зададени!! Защо LD_LIBRARY_PATH и NLSPATH не са зададени, когато отворя прозореца на терминала в Gnome?

Може да се твърди, че в Debian /etc/profile.d не е добро място за експортиране на променливи, но другите са ОК...


РЕДАКТИРАНЕ:

Ако добавя редове, предефиниращи LD_LIBRARY_PATH към /etc/profile, резултатът е същият като описания по-горе (променлива OK в влизане в shell, Empty в графичен терминал). Това има смисъл, защото /etc/profile се изпълнява само когато се създаде обвивка за влизане. Но другите променливи се зареждат правилно в терминалния Windows...

LD_LIBRARY_PATH управлява ли се по някакъв специален начин от системата?


РЕДАКТИРАНЕ 2:

Ако отворите прозорец на терминал и го принудите да влезе с потребителско име:

sudo login

Когато съм готов, мога да видя всички променливи OK, включително LD_LIBRARY_PATH. И така, това е проблем относно "login-shell" срещу "non login-shell"... но това няма смисъл, защото някои променливи се зареждат, а други не. Чувствайте се озадачени...


person Bull    schedule 15.06.2014    source източник
comment
Като настрана, тези скриптове не трябва да се нуждаят от shebang линия; и тъй като използвате синтаксиса на Bash, /bin/sh със сигурност е грешен.   -  person tripleee    schedule 15.06.2014
comment
В интерес на истината, тези скриптове не трябва да използват Bash синтаксис. т.е. всяко export var=value трябва да се преобразува в var=value; export var   -  person tripleee    schedule 15.06.2014
comment
Благодаря за вашите коментари! Винаги е добре да подобрявате знанията си с подробности, като посочените от вас, момчета   -  person Bull    schedule 16.06.2014


Отговори (1)


Намерих приемливо решение.

Борих се с това цели 2 дни... докато не публикувах това този следобед, а сега тази вечер намерих обяснение и заобиколно решение. Най-полезната връзка, която видях, беше https://bugs.launchpad.net/ubuntu/+source/xorg/+bug/366728/comments/17

По принцип ssh init процесът в X11 нулира LD_LIBRARY_PATH и NLSPATH, така че програмите и терминалите, стартирани от мениджъра на прозорци (те не са обвивка за влизане), намират тези променливи за празни. Решението е да ги експортирате преди нулирането, направено от 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 г., без стандартно решение в днешно време.

person Bull    schedule 15.06.2014