【问题标题】:Using CMake with ifort compiler将 CMake 与 ifort 编译器一起使用
【发布时间】:2012-05-06 12:46:33
【问题描述】:

我在带有 Intel 11.0 编译器的 Linux 机器上使用 CMake 2.8.7。我第一次尝试使用 CMake,因为我想在 Windows 和 Linux 机器上构建这个项目。

我首先使用了一个简单的方法,并使用了一个标准的 Hello World 示例: 我的 src/HelloWorld.f90:

!Test helloworld in Fortran using Cmake
program hello
    print *, "Hello World!"
end program hello

我的主要 CMakeLists.txt:

# States that CMake required version must be greater than 2.8.7
cmake_minimum_required(VERSION 2.8.7)
enable_language (Fortran)
project(helloworld Fortran)
add_subdirectory(src)
SET_TARGET_PROPERTIES(helloworld PROPERTIES LINKER_LANGUAGE FORTRAN)

我的 src/CMakeLists.txt:

cmake_minimum_required(VERSION 2.8.7)

# Include the directory itself as a path to include directories
set(CMAKE_INCLUDE_CURRENT_DIR ON)

# For a large number of source files you can create it in a simpler way
# using file() function:
file(GLOB helloworld_SOURCES *.f90)

我仍然收到一条错误消息,提示缺少 CMAKE_FORTRAN_LINK_EXECUTABLE 变量。我查看了Abinader's CMake tutorial#1,但到目前为止还没有成功。

有什么建议吗??提前致谢!

【问题讨论】:

  • 嗨!你找到答案了吗?我对 ifort 也有一些问题,但上下文不同:Windows。 ;-) 看来,CMake 对 Intel 的 Fortran 编译器的支持不是很好... :-(

标签: cmake fortran intel-fortran


【解决方案1】:

不是一个直接的答案,因为我从未在 cmake 中使用过 fortran,但我可以在这里看到一些问题。

首先:您的目标helloworld 定义在哪里? project 不是目标。

其次:你在哪里使用helloworld_SOURCES变量?

尝试更常规的方式。在您的 src/CMakeLists.txt 文件末尾添加行:

add_executable(helloworld ${helloworld_SOURCES})

同时将SET_TARGET_PROPERTIES(helloworld PROPERTIES LINKER_LANGUAGE FORTRAN) 从主目录中删除,因为它不是必需的。

最后一条建议:尽量不要使用file(GLOB )。最好手动定义所有文件的列表。

【讨论】:

    【解决方案2】:

    设置链接器语言时,可能是大写的“FORTRAN”。尝试在 enable_language 语句中将其写为“Fortran”。 CMake 从语言派生它使用的变量,这导致 CMake 查找 CMAKE_FORTRAN_LINK_EXECUTABLE 而不是 CMAKE_Fortran_LINK_EXECUTABLE。

    【讨论】:

    • 我使用了 CMAKE_Fortran_LINK_EXECUTABLE,但 CMake 仍然抱怨。是否需要为 Fortran 指定一些标志??
    【解决方案3】:

    正如 Michal 所提到的,add_executable 必须添加到您的 CMakeLists.txt 中。

    我使用以下 CMake 配置文件测试了您的问题

    主 CMakeLists.txt:

    # States that CMake required version must be greater than 2.8.7
    cmake_minimum_required(VERSION 2.8.7)
    enable_language (Fortran)
    project(helloworld Fortran)
    add_subdirectory(src)
    

    src/CMakeLists.txt:

    cmake_minimum_required(VERSION 2.8.7)
    
    add_executable(helloworld HelloWorld.f90)
    

    Linux 下为以下版本:

    ifort (ifort) 16.0.0.20150815

    cmake 版本 2.8.12.2

    我更喜欢使用cmake-gui。在那里您可以定义ifort 编译器,如下所示:

    定义源代码和二进制文件夹后,例如build,按“配置”并选择

    点击“下一步”并定义以下编译器

    点击“完成”和“生成”。

    转到build/src 文件夹并执行make。使用ifort 成功生成了helloworld 可执行文件,可以在此处调用。

    提示:如果 ifort 已经是您 Linux 计算机上的默认本地编译器,那么您不必在 cmake-gui 中指定它,并且可以继续使用第一个选项“使用默认本地编译器”。

    希望对你有帮助。

    【讨论】:

      【解决方案4】:

      让我们一步一步地尝试:

      1) 你的 Fortran 你好,世界还好!

      src/hello.f90

      !Test helloworld in Fortran using Cmake
      program hello
           print *, "Hello World!"
      end program hello
      

      2) 现在让我们编写“内部”CMakeLists.txt

      src/CMakeLists.txt

      add_executable(helloworld hello.f90)
      set_target_properties(
          helloworld 
      
          PROPERTIES 
          LINKER_LANGUAGE Fortran
          RUNTIME_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/build)
      

      在这里,我们创建了一个 executable 文件,您的问题中没有该文件。此外,我们将其链接器语言设置为Fortran(它是区分大小写的参数!)和编译文件的输出目录。

      3) 现在我们将创建“主”CMakeLists.txt

      CMakeLists.txt

      # States that CMake required version must be greater than 2.8.7
      cmake_minimum_required(VERSION 2.8.7)
      
      project(helloworld Fortran)
      
      add_subdirectory(src)
      
      

      这里我们指定了 src 子目录和内部 CMakeLists.txt 和编译器语言 - 使用 project() 函数就足够了,不需要与 enable_language() 一起使用。

      4) 最后,让我们以 out-of-source 的方式构建我们的代码并运行它!

      1. cmake -S . -B build
      2. cmake --build build
      3. ./build/helloworld

      【讨论】:

        猜你喜欢
        • 2012-03-21
        • 1970-01-01
        • 2022-11-10
        • 2023-04-06
        • 1970-01-01
        • 2014-07-11
        相关资源
        最近更新 更多