VSCode使用makefile调用Intel Fortran报ifort命令不存在问题咨询
VSCode执行内置shell任务时,默认启动的是非交互式非登录shell,不会加载~/.zshrc中的配置。你写在.zshrc里的Intel oneAPI环境初始化命令source ~/intel/oneapi/setvars.sh没有被执行,PATH变量里没有ifort的所在路径,自然会报Command not found错误。
以下三种方法任选其一即可,优先推荐前两种。
方案1:修改tasks.json,任务执行前先加载环境
这是改动最小、影响范围仅限当前工作区的方案,直接修改任务执行命令,在运行make前先加载oneAPI环境即可,修改后的tasks.json内容如下:
{ "version": "2.0.0", "tasks": [ { "label": "make", "type": "shell", "command": "source ~/intel/oneapi/setvars.sh && make -j4", "options": { "cwd": "${workspaceRoot}" }, "problemMatcher": [] } ] }
注意:如果你的oneAPI不是安装在默认的~/intel/oneapi/路径下,把上面的setvars.sh路径替换成你本地的实际路径即可。
方案2:将oneAPI环境配置写入zsh登录加载文件
zsh启动非交互式shell时会读取~/.zprofile中的配置,你只需要把原来写在~/.zshrc里的source ~/intel/oneapi/setvars.sh这行内容,移动到~/.zprofile文件末尾即可,如果文件不存在直接新建就行。
修改完成后完全退出VSCode再重新打开,所有终端和任务都会正常加载Intel编译器环境,不需要每次手动source。
方案3:Makefile中写死ifort绝对路径
如果不想修改shell或者VSCode配置,可以直接在普通系统终端执行which ifort拿到ifort的完整绝对路径,比如返回结果为/home/xxx/intel/oneapi/compiler/2022.1.0/linux/bin/intel64/ifort,就把Makefile里的FC=ifort替换为:
FC=/home/xxx/intel/oneapi/compiler/2022.1.0/linux/bin/intel64/ifort
这个方法的缺点是兼容性差,更换设备、升级oneAPI版本导致路径变化时,需要重新修改Makefile,仅适合临时使用。
配置完成后,先在VSCode集成终端执行echo $PATH | grep intel,如果输出内容包含oneAPI的bin路径,再执行make任务就不会出现命令找不到的错误。
内容的提问来源于stack exchange,提问作者krishnab

