我有一个困扰我很长时间的问题。我正在使用 Intel C++ 编译器,其中包含 shell 脚本来设置库路径的环境变量,包括路径等。采购这些脚本.bashrc
就像终端的魅力一样。不幸的是,我需要环境变量数学和NetBeans C++这也让我想到了一个问题,如何获取英特尔脚本,以便我启动的 GUI 程序能够识别它们。
我仔细地搜索了网络,我想我已经找到了这个问题,尽管我没有解释。为 Gnome 设置环境变量的一种方法似乎是创建一个*.sh
脚本,/etc/profile.d/
然后由/etc/profile
.
虽然,关于此信息不推荐这样做/etc/profile
,请注意,我有一个 shell 脚本,需要获取源代码,而不仅仅是一些export VAR=blub
设置。
如果我使用egmklvars.sh
脚本执行此操作,则似乎未获取完整的文件。让我从文件中截取一段内容来说明我的意思
#! /bin/sh
#
# Copyright (C)
# ...lot of boring stuff
CPRO_PATH=/opt/intel/composer_xe_2013_sp1.0.080
export MKLROOT=${CPRO_PATH}/mkl
SCRIPT_NAME=$0
MOD_NAME=mod
# .... some more code here ...
if [ -z "${MKL_TARGET_ARCH}" ] ; then
echo
echo "ERROR: architecture is not defined. Accepted values: ia32, intel64, mic"
mkl_help
else
if [ -n "${LD_LIBRARY_PATH}" ] ; then OLD_LD_LIBRARY_PATH=":${LD_LIBRARY_PATH}"; fi
export LD_LIBRARY_PATH="${CPRO_PATH}/compiler/lib/${MKL_TARGET_ARCH}: #.....
当我现在再次注销/登录时,MKLROOT
变量已定义但未LD_LIBRARY_PATH
调整。export VAR
在采购 .net 文件时,似乎会跳过比简单的更复杂的事情.profile
。
问题:有没有一种方便的方法来获取 X-Session 的编译器变量脚本(在我的例子中是 Gnome)?有人知道这里出了什么问题吗?
解决这个问题的明显技巧是在手动获取脚本并将它们放入全局profile
.这样做的缺点是,我在编译器的每次更新时都会一遍又一遍地执行此操作。
一步步
让我一步步展示,以便您看到我并不是完全疯了。为此我把数学内核库脚本在pastebin上,我从以下情况开始:
- 我没有在任何 或其他文件中获取该
bashrc
脚本profile
。 - 我已经退出并重新登录
对于测试,我们查看$MKLROOT
和$LD_LIBRARY_PATH
,两者都应该由脚本更改。目前,当我检查它们的值时,它们没有设置
echo $LD_LIBRARY_PATH
echo $MKLROOT
当我手动获取文件时,我得到:
source /opt/intel/composer_xe_2013_sp1.0.080/mkl/bin/mklvars.sh intel64
echo $MKLROOT
echo $LD_LIBRARY_PATH
# Output:
# /opt/intel/composer_xe_2013_sp1.0.080/mkl
# opt/intel/composer_xe_2013_sp1.0.080/compiler/lib/intel64:/opt/intel/composer_xe_2013_sp1.0.080/mkl/lib/intel64
当我将该source
行放入我的终端~/.bashrc
并打开一个新终端时,两个变量都已正确设置,如上所示。现在,我从 中删除该source
行~/.bashrc
并将其放入 中/etc/profile.d/intelCC.sh
,保存并注销/登录。
登录后,没有设置任何变量,但我的~/.xsession-errors
说法有错误消息:
/usr/sbin/lightdm-session: 1: /etc/profile.d/intelCC.sh: source: not found
现在我source
用一个简单的替换.
,这样/etc/profile.d/intelCC.sh
包含现在
. /opt/intel/composer_xe_2013_sp1.0.080/mkl/bin/mklvars.sh intel64
再次相同:保存、注销并登录。现在似乎没有.xsession-errors
与此相关的错误,最后:
echo $MKLROOT
# /opt/intel/composer_xe_2013_sp1.0.080/mkl
echo $LD_LIBRARY_PATH
# empty
答案1
确认 MKL_TARGET_ARCH 已设置
当您将其添加到/etc/profile.d
目录时,变量可能$MKL_TARGET_ARCH
尚未设置或尚未设置,因此if/else
基本上会跳过整个块。
您可以通过暂时设置该语句$MKL_TARGET_ARCH
上方的内容来测试该理论if/else
,然后尝试再次登录以查看其是否有效。
MKL_TARGET_ARCH="..something.."
if [ -z "${MKL_TARGET_ARCH}" ] ; then
安装英特尔编译器
我没有这个编译器,因此无法向您提供确切的详细信息,但我在 15 年的大部分时间里一直致力于安装工程应用程序,因此我对这个领域有一定的了解。
无论如何,当您安装这些类型的工具时,您通常必须创建自己的环境文件,或者提供一个环境文件。我发现这篇关于英特尔 Fortran 编译器的文章,但如果产品如此不同,我会感到惊讶。
如果您浏览这篇文章,您会注意到安装 ( install.sh
) 后的一个步骤,其中将文件复制到/etc/profile.d
.该文件包含需要进行的环境设置。
cp /opt/intel/Compiler/11.1/056/bin/ia32/iccvars_ia32.sh /etc/profile.d/
我怀疑该产品也需要执行类似的步骤。仔细检查您的安装是否已使用此页面中的发行版特定步骤完成:
最终解决方案
如果
.
有效但source
无效,那么您可能正在处理 Bourne shell 而不是 Bash。 Bash 支持两者,而 Bourne shell (/bin/sh
) 则不支持。
如果你看一下在本文件中然后你会发现这似乎正是你的问题所在。
Ubuntu 12.0x 将 /bin/sh 的链接从 /bin/bash 更改为 /bin/dash。 13.0.0.079 的英特尔安装脚本参考 /bin/sh 但假设/要求这是 bourne 或 bash(sh 或 bash),但不是与破折号兼容。