Linux环境下如何通过CMake为LAPACK配置ifort编译器?
Linux下使用ifort编译LAPACK操作指南
以下方法均在Ubuntu 22.04、RHEL 8、Intel oneAPI 2024版本环境下验证通过。
方案一:CMake调用ifort编译
这是优先推荐的方案,配置灵活,后续升级版本、调整编译选项更方便。
- 前置准备
- 安装Intel oneAPI HPC组件包,确保ifort编译器可正常调用
- 获取LAPACK源码压缩包,解压到普通用户有权限的工作目录,不要在root专属目录下操作
- 加载编译环境
打开终端执行环境变量加载命令,默认安装路径下命令如下,自定义安装路径需替换为实际路径:
执行完成后输入source /opt/intel/oneapi/setvars.shifort --version,能正常输出版本信息即环境加载成功。 - 构建编译目录
不要直接在源码根目录执行编译,单独新建build目录隔离编译产出:mkdir build && cd build - CMake配置
执行如下配置命令,注意把安装路径替换为自己的目标路径:
最后一个参数cmake .. \ -DCMAKE_Fortran_COMPILER=ifort \ -DCMAKE_BUILD_TYPE=Release \ -DCMAKE_INSTALL_PREFIX=/home/yourname/local/lapack_ifort \ -DBUILD_SHARED_LIBS=ON \ -DLAPACKE=ON \ -DBLAS_LIBRARIES=""-DBLAS_LIBRARIES=""是强制让LAPACK编译自带的参考BLAS实现,避免CMake自动找到系统里用gfortran编译的BLAS库导致混编报错。如果需要C语言调用接口就保留-DLAPACKE=ON,纯Fortran使用可以删掉这行。 - 编译安装
执行编译,线程数和CPU核心数对齐即可:
编译完成后到指定的安装路径下查看,make -j$(nproc) make installlib目录存在liblapack.so/liblapack.a,include目录存在对应头文件/模块文件即为编译成功。
方案二:基于原生Make构建编译(CMake方案异常时使用)
如果环境里CMake版本过低、或者和现有环境存在兼容问题,可以直接用LAPACK自带的Makefile构建:
- 前置准备:和CMake方案一致,先加载ifort对应的环境变量,确认
ifort --version可正常输出,解压LAPACK源码到工作目录。 - 修改编译配置
进入LAPACK源码根目录,复制官方提供的配置模板:
编辑cp make.inc.example make.incmake.inc文件,修改如下核心配置:- 将
FC = gfortran修改为FC = ifort - 将
FFLAGS = -O2 -frecursive修改为FFLAGS = -O2 -recursive -fPIC,其中-recursive是ifort适配Fortran递归子程序的参数,-fPIC用于生成位置无关代码,方便后续链接到动态库或者其他程序 - 确认
BLASLIB = ../../librefblas.a行未被注释,强制编译自带参考BLAS,避免混编问题
- 将
- 执行编译
在源码根目录直接执行:
编译完成后,源码根目录下会生成make -j$(nproc)liblapack.a、librefblas.a、libtmglib.a三个静态库文件,直接拷贝到自己的库目录即可使用。如果需要动态库,可以基于编译好的目标文件用ifort自行链接生成。
常见问题排查
- 执行编译命令提示找不到ifort:不要加sudo执行编译,sudo会重置普通用户的环境变量,重新在普通用户权限下加载oneAPI环境变量即可
- 链接阶段出现gfortran相关的未定义符号:是混编了系统自带的gfortran版本BLAS/LAPACK,清空build目录(CMake方案)或者清理make缓存(Make方案,执行
make clean),重新配置强制使用自带参考BLAS即可- 编译阶段报Fortran语法错误:如果使用的是2020年之前的老版本Intel Parallel Studio自带的ifort,对3.10+版本的LAPACK语法兼容性较差,升级到oneAPI版本的ifort即可解决
内容的提问来源于stack exchange,提问作者DavidS
相关产品推荐
相关产品推荐

