使用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-devuse lapack95是Fortran 95标准的封装,依赖liblapack95-dev,编译时需额外链接lapack95库
内容的提问来源于stack exchange,提问作者Kyle
相关产品推荐
相关产品推荐

