Система: 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"... но това няма смисъл, защото някои променливи се зареждат, а други не. Чувствайте се озадачени...
/bin/sh
със сигурност е грешен. - person tripleee   schedule 15.06.2014export var=value
трябва да се преобразува вvar=value; export var
- person tripleee   schedule 15.06.2014