You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用CMake构建Fortran程序调用LAPACK模块遇错求助

问题描述

本人是CMake新手,已在/usr/lib/x86_64-linux-gnu/路径下安装BLAS和LAPACK:

  • 使用f95编译时,CMake能检测到BLAS与LAPACK库,程序可正常编译;但在main.f90中添加use lapack或use lapack95语句时,出现找不到lapack.mod文件的错误。
  • 改用gfortran编译时无语法报错,但CMake未输出BLAS和LAPACK已找到的提示信息。

无use lapack时的编译输出

opt/clion-2023.3.2/bin/cmake/linux/x64/bin/cmake --build /home/usrkm/CLionProjects/DVR/cmake-build-debug --target dvr -j 18 -v
Change Dir: '/home/usrkm/CLionProjects/DVR/cmake-build-debug'

Run Build Command(s): /opt/clion-2023.3.2/bin/ninja/linux/x64/ninja -v -j 18 dvr
[0/1] /opt/clion-2023.3.2/bin/cmake/linux/x64/bin/cmake --regenerate-during-build -S/home/usrkm/CLionProjects/DVR -B/home/usrkm/CLionProjects/DVR/cmake-build-debug
BLAS FOUND: /usr/lib/x86_64-linux-gnu/libblas.so
LAPACK FOUND: /usr/lib/x86_64-linux-gnu/liblapack.so/usr/lib/x86_64-linux-gnu/libblas.so
-- Configuring done (0.0s)
-- Generating done (0.0s)
-- Build files have been written to: /home/usrkm/CLionProjects/DVR/cmake-build-debug
[1/14] gfortran -cpp   -g -fdiagnostics-color=always -llapack -E /home/usrkm/CLionProjects/DVR/grid_gen.f90 -o CMakeFiles/dvr.dir/grid_gen.f90-pp.f90 && /opt/clion-2023.3.2/bin/cmake/linux/x64/bin/cmake -E cmake_ninja_depends --tdi=CMakeFiles/dvr.dir/FortranDependInfo.json --lang=Fortran --src=CMakeFiles/dvr.dir/grid_gen.f90-pp.f90 --out=CMakeFiles/dvr.dir/grid_gen.f90-pp.f90 --dep=CMakeFiles/dvr.dir/grid_gen.f90-pp.f90.d --obj=CMakeFiles/dvr.dir/grid_gen.f90.o --ddi=CMakeFiles/dvr.dir/grid_gen.f90.o.ddi
[2/14] gfortran -cpp   -g -fdiagnostics-color=always -llapack -E /home/usrkm/CLionProjects/DVR/types.f90 -o CMakeFiles/dvr.dir/types.f90-pp.f90 && /opt/clion-2023.3.2/bin/cmake/linux/x64/bin/cmake -E cmake_ninja_depends --tdi=CMakeFiles/dvr.dir/FortranDependInfo.json --lang=Fortran --src=CMakeFiles/dvr.dir/types.f90-pp.f90 --out=CMakeFiles/dvr.dir/types.f90-pp.f90 --dep=CMakeFiles/dvr.dir/types.f90-pp.f90.d --obj=CMakeFiles/dvr.dir/types.f90.o --ddi=CMakeFiles/dvr.dir/types.f90.o.ddi
[3/14] gfortran -cpp   -g -fdiagnostics-color=always -llapack -E /home/usrkm/CLionProjects/DVR/io.f90 -o CMakeFiles/dvr.dir/io.f90-pp.f90 && /opt/clion-2023.3.2/bin/cmake/linux/x64/bin/cmake -E cmake_ninja_depends --tdi=CMakeFiles/dvr.dir/FortranDependInfo.json --lang=Fortran --src=CMakeFiles/dvr.dir/io.f90-pp.f90 --out=CMakeFiles/dvr.dir/io.f90-pp.f90 --dep=CMakeFiles/dvr.dir/io.f90-pp.f90.d --obj=CMakeFiles/dvr.dir/io.f90.o --ddi=CMakeFiles/dvr.dir/io.f90.o.ddi
[4/14] gfortran -cpp   -g -fdiagnostics-color=always -llapack -E /home/usrkm/CLionProjects/DVR/potentials.f90 -o CMakeFiles/dvr.dir/potentials.f90-pp.f90 && /opt/clion-2023.3.2/bin/cmake/linux/x64/bin/cmake -E cmake_ninja_depends --tdi=CMakeFiles/dvr.dir/FortranDependInfo.json --lang=Fortran --src=CMakeFiles/dvr.dir/potentials.f90-pp.f90 --out=CMakeFiles/dvr.dir/potentials.f90-pp.f90 --dep=CMakeFiles/dvr.dir/potentials.f90-pp.f90.d --obj=CMakeFiles/dvr.dir/potentials.f90.o --ddi=CMakeFiles/dvr.dir/potentials.f90.o.ddi
[5/14] gfortran -cpp   -g -fdiagnostics-color=always -llapack -E /home/usrkm/CLionProjects/DVR/dvr_solvers.f90 -o CMakeFiles/dvr.dir/dvr_solvers.f90-pp.f90 && /opt/clion-2023.3.2/bin/cmake/linux/x64/bin/cmake -E cmake_ninja_depends --tdi=CMakeFiles/dvr.dir/FortranDependInfo.json --lang=Fortran --src=CMakeFiles/dvr.dir/dvr_solvers.f90-pp.f90 --out=CMakeFiles/dvr.dir/dvr_solvers.f90-pp.f90 --dep=CMakeFiles/dvr.dir/dvr_solvers.f90-pp.f90.d --obj=CMakeFiles/dvr.dir/dvr_solvers.f90.o --ddi=CMakeFiles/dvr.dir/dvr_solvers.f90.o.ddi
[6/14] gfortran -cpp   -g -fdiagnostics-color=always -llapack -E /home/usrkm/CLionProjects/DVR/main.f90 -o CMakeFiles/dvr.dir/main.f90-pp.f90 && /opt/clion-2023.3.2/bin/cmake/linux/x64/bin/cmake -E cmake_ninja_depends --tdi=CMakeFiles/dvr.dir/FortranDependInfo.json --lang=Fortran --src=CMakeFiles/dvr.dir/main.f90-pp.f90 --out=CMakeFiles/dvr.dir/main.f90-pp.f90 --dep=CMakeFiles/dvr.dir/main.f90-pp.f90.d --obj=CMakeFiles/dvr.dir/main.f90.o --ddi=CMakeFiles/dvr.dir/main.f90.o.ddi
[7/14] /opt/clion-2023.3.2/bin/cmake/linux/x64/bin/cmake -E cmake_ninja_dyndep --tdi=CMakeFiles/dvr.dir/FortranDependInfo.json --lang=Fortran --dd=CMakeFiles/dvr.dir/Fortran.dd @CMakeFiles/dvr.dir/Fortran.dd.rsp
[8/14] gfortran -I/home/usrkm/CLionProjects/DVR -g -fdiagnostics-color=always -llapack -fpreprocessed -c CMakeFiles/dvr.dir/types.f90-pp.f90 -o CMakeFiles/dvr.dir/types.f90.o
[9/14] gfortran -I/home/usrkm/CLionProjects/DVR -g -fdiagnostics-color=always -llapack -fpreprocessed -c CMakeFiles/dvr.dir/grid_gen.f90-pp.f90 -o CMakeFiles/dvr.dir/grid_gen.f90.o
[10/14] gfortran -I/home/usrkm/CLionProjects/DVR -g -fdiagnostics-color=always -llapack -fpreprocessed -c CMakeFiles/dvr.dir/io.f90-pp.f90 -o CMakeFiles/dvr.dir/io.f90.o
[11/14] gfortran -I/home/usrkm/CLionProjects/DVR -g -fdiagnostics-color=always -llapack -fpreprocessed -c CMakeFiles/dvr.dir/potentials.f90-pp.f90 -o CMakeFiles/dvr.dir/potentials.f90.o
[12/14] gfortran -I/home/usrkm/CLionProjects/DVR -g -fdiagnostics-color=always -llapack -fpreprocessed -c CMakeFiles/dvr.dir/dvr_solvers.f90-pp.f90 -o CMakeFiles/dvr.dir/dvr_solvers.f90.o
[13/14] gfortran -I/home/usrkm/CLionProjects/DVR -g -fdiagnostics-color=always -llapack -fpreprocessed -c CMakeFiles/dvr.dir/main.f90-pp.f90 -o CMakeFiles/dvr.dir/main.f90.o
[14/14] : && gfortran  -g CMakeFiles/dvr.dir/types.f90.o CMakeFiles/dvr.dir/io.f90.o CMakeFiles/dvr.dir/grid_gen.f90.o CMakeFiles/dvr.dir/potentials.f90.o CMakeFiles/dvr.dir/dvr_solvers.f90.o CMakeFiles/dvr.dir/main.f90.o -o dvr  /usr/lib/x86_64-linux-gnu/libblas.so  /usr/lib/x86_64-linux-gnu/liblapack.so  /usr/lib/x86_64-linux-gnu/libblas.so  /usr/lib/x86_64-linux-gnu/liblapack.so && :

Build finished

添加use lapack后的报错日志

/opt/clion-2023.3.2/bin/cmake/linux/x64/bin/cmake --build /home/usrkm/CLionProjects/DVR/cmake-build-debug --target dvr -j 18 -v
Change Dir: '/home/usrkm/CLionProjects/DVR/cmake-build-debug'

Run Build Command(s): /opt/clion-2023.3.2/bin/ninja/linux/x64/ninja -v -j 18 dvr
[1/2] gfortran -I/home/usrkm/CLionProjects/DVR -g -fdiagnostics-color=always -llapack -fpreprocessed -c CMakeFiles/dvr.dir/main.f90-pp.f90 -o CMakeFiles/dvr.dir/main.f90.o
FAILED: CMakeFiles/dvr.dir/main.f90.o
gfortran -I/home/usrkm/CLionProjects/DVR -g -fdiagnostics-color=always -llapack -fpreprocessed -c CMakeFiles/dvr.dir/main.f90-pp.f90 -o CMakeFiles/dvr.dir/main.f90.o
/home/usrkm/CLionProjects/DVR/main.f90:7:6:

    7 |         use lapack
      |             1
Fatal Error: Cannot open module file ‘lapack.mod’ for reading at (1): No such file or directory
compilation terminated.
ninja: build stopped: subcommand failed.
解决方案

1. 确认并安装带模块文件的LAPACK包

系统默认安装的BLAS/LAPACK通常只提供二进制库,没有生成Fortran模块文件(.mod)。先检查系统中是否存在相关模块:

find /usr -name "lapack*.mod"

如果未找到,在Debian/Ubuntu系统中安装带模块的开发包:

sudo apt-get install liblapack-dev liblapack95-dev

2. 修正CMakeLists.txt配置

使用CMake内置的FindBLAS.cmake和FindLAPACK.cmake自动处理库路径和模块依赖,示例配置如下:

cmake_minimum_required(VERSION 3.10)
project(dvr Fortran)

# 指定Fortran模块输出目录,确保编译时能找到.mod文件
set(CMAKE_Fortran_MODULE_DIRECTORY ${PROJECT_BINARY_DIR}/modules)
include_directories(${PROJECT_BINARY_DIR}/modules)

# 查找BLAS和LAPACK库
find_package(BLAS REQUIRED)
find_package(LAPACK REQUIRED)

# 打印库信息,确认CMake已找到依赖
message(STATUS "BLAS FOUND: ${BLAS_LIBRARIES}")
message(STATUS "LAPACK FOUND: ${LAPACK_LIBRARIES}")

# 添加可执行文件,包含所有源文件
add_executable(dvr main.f90 types.f90 io.f90 grid_gen.f90 potentials.f90 dvr_solvers.f90)

# 链接BLAS和LAPACK库
target_link_libraries(dvr PRIVATE ${BLAS_LIBRARIES} ${LAPACK_LIBRARIES})

3. 清理编译缓存并重建

之前的编译缓存可能导致配置不生效,执行以下步骤:

cd /home/usrkm/CLionProjects/DVR/cmake-build-debug
rm -rf ./*
cmake ..
cmake --build . -j 18

4. 模块使用说明

  • use lapack对应传统LAPACK的Fortran 77接口封装模块,依赖liblapack-dev
  • use lapack95是Fortran 95标准的封装,依赖liblapack95-dev,编译时需额外链接lapack95库

内容的提问来源于stack exchange,提问作者Kyle

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 14:42:02