【问题标题】:Using cmake with fortran将 cmake 与 fortran 一起使用
【发布时间】:2012-10-08 21:19:40
【问题描述】:

尽管 cmake 声称的很好,但它的文档似乎还有很多不足之处(除非我完全无法理解基础知识)。

我正在尝试为一组 fortran 程序编写一个 cmake 文件,这些程序还依赖于其他一些库(这些库已经为我的系统编译,但我也想为这些库创建一个 cmake 文件)。

我在网上示例中找到的很多命令都没有出现在官方文档中,这有点令人不安。例如,http://www.vtk.org/Wiki/CMakeForFortranExample 包含该行

get_filename_component (Fortran_COMPILER_NAME ${CMAKE_Fortran_COMPILER} NAME)

然而,当我将它包含在我自己的 CMakeLists.txt 中时,我得到一个错误

Missing variable is:
CMAKE_fortran_COMPILER

我错过了什么?!

编辑:当前 CMakeLists.txt

cmake_minimum_required(VERSION 2.6)

enable_language(fortran)
project(fortranTest)
get_filename_component (Fortran_COMPILER_NAME ${CMAKE_Fortran_COMPILER} NAME)

编辑 2

我还没有弄清楚如何包含依赖库。

【问题讨论】:

  • 在你做任何事情之前你ENABLE_LANGUAGE(Fortran)了吗?我们成功地在一个非常大的 Fortran 流体动力学代码上使用了 CMake,几乎没有问题(无论如何都与 Fortran 相关)。
  • 另外,您可以编辑您的帖子以包含您的 CMakeLists.txt 吗?错误在fortran 中有一个小写f,而您的示例行有一个大写F。此外,还有更好的方法来执行示例尝试使用该信息执行的操作,例如 if(${CMAKE_Fortran_COMPILER_ID} STREQUAL "Intel") 它可以保护您,以防可执行文件被命名为 fun(例如在使用 ftn 包装的 Cray 系统上)。
  • @tpg2114 是的,我愿意 - 我已经编辑了我的问题以显示我目前得到的内容
  • 在enable_language() 调用中必须是Fortran 而不是fortran。

标签: cmake fortran


【解决方案1】:

语言名称区分大小写。正如发布的那样,我得到:

~/cmt> cmake ./
CMake Error: Error required internal CMake variable not set, cmake may be not be built correctly.
Missing variable is:
CMAKE_fortran_COMPILER_ENV_VAR
CMake Error: Error required internal CMake variable not set, cmake may be not be built correctly.
Missing variable is:
CMAKE_fortran_COMPILER
CMake Error: Could not find cmake module file:/home/tgallagher/cmt/CMakeFiles/CMakefortranCompiler.cmake
CMake Error: Could not find cmake module file:CMakefortranInformation.cmake
CMake Error: CMAKE_fortran_COMPILER not set, after EnableLanguage
-- The C compiler identification is GNU
-- The CXX compiler identification is GNU
-- Check for working C compiler: /usr/bin/gcc
-- Check for working C compiler: /usr/bin/gcc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working CXX compiler: /usr/bin/c++
-- Check for working CXX compiler: /usr/bin/c++ -- works
-- Detecting CXX compiler ABI info
^C

但是,通过将文件更改为(注意它是Fortran 而不是enable_language() 中的fortran:

cmake_minimum_required(VERSION 2.6)

enable_language(Fortran)
project(fortranTest)
get_filename_component (Fortran_COMPILER_NAME ${CMAKE_Fortran_COMPILER} NAME)

你得到:

~/cmt> cmake ./
-- The Fortran compiler identification is GNU
-- Check for working Fortran compiler: /usr/bin/gfortran
-- Check for working Fortran compiler: /usr/bin/gfortran  -- works
-- Detecting Fortran compiler ABI info
-- Detecting Fortran compiler ABI info - done
-- Checking whether /usr/bin/gfortran supports Fortran 90
-- Checking whether /usr/bin/gfortran supports Fortran 90 -- yes
-- The C compiler identification is GNU
-- The CXX compiler identification is GNU
-- Check for working C compiler: /usr/bin/gcc
^C

如果允许完成,它将按预期工作。但是,为了确定编译器标志,有更好的方法来识别编译器。引用示例中使用的方法仅适用于未包装编译器的系统,这意味着不通过 Cray 上的 mpif90 或 ftn 之类的方式调用编译器的系统。更好的方法是检查:

if(${CMAKE_Fortran_COMPILER_ID} STREQUAL "Intel")
...
endif()

可以通过检查 CMake 模块目录 Modules/CMakeFortranCompilerId.F.in 中的文件找到可能的名称列表

【讨论】:

  • 谢谢 :) 我读到命令不区分大小写,我也(错误地!)假设这意味着整个文件不区分大小写
猜你喜欢
  • 1970-01-01
  • 2015-04-08
  • 2019-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-17
  • 2019-02-01
相关资源
最近更新 更多