用Cmake来编译fortran

用CMake来编译Fortran
原文链接: https://www.lainme.com/doku.php/blog/2015/12/%E7%94%A8cmake%E6%9D%A5%E7%BC%96%E8%AF%91fortranhttps://www.lainme.com/doku.php/blog/2015/12/%E7%94%A8cmake%E6%9D%A5%E7%BC%96%E8%AF%91fortran
用具体例子简单记述一下cmake的一些用法,从此摆脱手写Makefile的痛苦,投入手写CMakeLists.txt的苦海中。

最好的参考资料:CMake文档
编译单文件

先建立有如下内容的CMakeLists.txt文件

# (必要) CMake最低版
cmake_minimum_required(VERSION 2.8.5)
#(可选) 项目/程序/软件名称
project(MyProgram)


# (必要) 启用Fortran支持
enable_language(Fortran)
# (可选) 将编译类型设置为Release,这会使用-O3进行优化
set(CMAKE_BUILD_TYPE Release)
# (必须) 将myprogram.f90编译为myprogram可执行文件
add_executable(myprogram myprogram.f90) 

为了清晰区分源码和编译中产生的文件,可以在单独目录下进行编译

mkdir build && cd build
cmake ..
make

这样会在build目录下生成myprogram这个可执行文件

如需更换默认编译器,可以先输出编译器的环境变量

export FC=ifort && cmake ..

编译多个源码到一个可执行文件或动态链接库

cmake_minimum_required(VERSION 2.8.5)
project(MyProgram)
enable_language(Fortran)
set(CMAKE_BUILD_TYPE Release)
#这当前项目里lib目录下的所有文件(包含子目录下的文件)添加到SRCS这个变量里
file(GLOB_RECURSE SRCS RELATIVE ${PROJECT_SOURCE_DIR} lib/*)
# 将SRCS编译为mylib这个动态链接库
add_library(mylib SHARED ${SRCS})

file(GLOB_RECURSE SRCS RELATIVE ${PROJECT_SOURCE_DIR} src/*)
add_executable(myprogram ${SRCS})
# 让myprogram依赖mylib
add_dependencies(myprogram mylib)
# 链接mylib
target_link_libraries(myprogram mylib)

启用OpenMP支持

cmake_minimum_required(VERSION 2.8.5)
project(MyProgram)
enable_language(Fortran)
set(CMAKE_BUILD_TYPE Release)

# 查找是否安装了OpenMP
find_package(OpenMP) 
# 设置编译器选项
set(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} ${OpenMP_Fortran_FLAGS}") 

add_executable(myprogram myprogram.f90) 

启用MPI支持

cmake_minimum_required(VERSION 2.8.5)
project(MyProgram)
enable_language(Fortran)
set(CMAKE_BUILD_TYPE Release)

find_package(MPI) 
set(CMAKE_Fortran_COMPILE_FLAGS "${CMAKE_Fortran_COMPILE_FLAGS} ${MPI_Fortran_COMPILE_FLAGS}")
set(CMAKE_Fortran_LINK_FLAGS "${CMAKE_Fortran_LINK_FLAGS} ${MPI_Fortran_LINK_FLAGS}")
# 包含MPI路径到搜索路径
include_directories(SYSTEM ${MPI_Fortran_INCLUDE_PATH})

add_executable(myprogram myprogram.f90) 
# 链接MPI动态链接库
target_link_libraries(myprogram ${MPI_Fortran_LIBRARIES})

设置开关来控制OpenMP或MPI

cmake_minimum_required(VERSION 2.8.5)
project(MyProgram)
enable_language(Fortran)
set(CMAKE_BUILD_TYPE Release)

# 设置一个名为ENABLE_OPENMP的选项,并默认为ON
option(ENABLE_OPENMP "Enable OpenMP" ON)
# 如果ENABLE_OPENMP为ON则启用OpenMP
if(ENABLE_OPENMP)
    find_package(OpenMP) 
    set(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} ${OpenMP_Fortran_FLAGS}") 
endif()

add_executable(myprogram myprogram.f90) 

如果要更改选项的值,可以在编译时使用

cmake -DENABLE_OPENMP=OFF ..

路径与安装

如果需要能将程序安装到系统中,需要先设置好路径

cmake_minimum_required(VERSION 2.8.5)
project(MyProgram)
enable_language(Fortran)
set(CMAKE_BUILD_TYPE Release)

# Fortran .mod 文件的输出路径,这里是build/include
set(CMAKE_Fortran_MODULE_DIRECTORY ${PROJECT_BINARY_DIR}/include)
# 动态链接库输出路径,这里是build/lib
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/lib)
# 可执行文件输出路径,这里是build/bin
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/bin)

# 安装build/bin到CMAKE_INSTALL_PREFIX/bin
install(DIRECTORY ${PROJECT_BINARY_DIR}/bin/ DESTINATION bin)
# 安装build/lib到CMAKE_INSTALL_PREFIX/lib
install(DIRECTORY ${PROJECT_BINARY_DIR}/lib/ DESTINATION lib)
# 安装build/include到CMAKE_INSTALL_PREFIX/include/myprogram
install(DIRECTORY ${PROJECT_BINARY_DIR}/include/ DESTINATION include/myprogram)

file(GLOB_RECURSE SRCS RELATIVE ${PROJECT_SOURCE_DIR} lib/*)
add_library(mylib SHARED ${SRCS})

file(GLOB_RECURSE SRCS RELATIVE ${PROJECT_SOURCE_DIR} src/*)
add_executable(myprogram ${SRCS})
add_dependencies(myprogram mylib)
target_link_libraries(myprogram mylib)

CMAKE_INSTALL_PREFIX通常默认是/usr/local,如果想要更改可以使用如下命令编译

cmake -DCMAKE_INSTALL_PREFIX=/usr ..

卸载安装的文件

cd build && sudo xargs rm < install_manifest.txt

所以install_manifest.txt这个文件不要删…… #

猜你喜欢

转载自blog.csdn.net/baidu_29950065/article/details/72716650
今日推荐