【问题标题】:CMake Fortran project with multiple executables具有多个可执行文件的 CMake Fortran 项目
【发布时间】:2014-08-26 14:28:25
【问题描述】:

我为 Fortran 应用程序开发了一个基于 CMake 的编译过程。该应用程序由放置在当前目录中的多个模块文件组成。我还创建了一个名为tst 的测试目录,其中包含测试应用程序模块中重要功能和子例程的小程序。

一切都很好,除了我无法让 Cmake 正确编译测试程序。目前只有一个名为tst_inter_s 的测试程序。它被编译并生成了一个可执行文件,但不是编译实际的tst_inter_s Cmake 似乎选择了主项目可执行文件并再次编译它。它与主项目文件具有相同的大小和内容。任何纠正 CMakeLists 文件的帮助将不胜感激。它们张贴在下面。

CMakeLists.txt,主目录

# Minimum cmake version
cmake_minimum_required(VERSION 2.8)

# Project name
project(hsg_1d Fortran)

# Toolchain selection, possible arguments: Intel, gFortran
SET(Toolchain Intel)

# Compiler selection
include(CMakeForceCompiler) 

# GNU compilers
if(${Toolchain} MATCHES gFortran)
  CMAKE_FORCE_Fortran_COMPILER(gfortran "gfortran")
  CMAKE_FORCE_C_COMPILER(gcc "gcc")
  CMAKE_FORCE_C_COMPILER(g++ "g++")
endif(${Toolchain} MATCHES gFortran)

# Intel compilers
if(${Toolchain} MATCHES Intel)
  CMAKE_FORCE_Fortran_COMPILER(ifort "Intel Fortran Compiler")
  set(CMAKE_Fortran_FLAGS "-fpp -heap-arrays -g -O0 -traceback -check bounds ${CMAKE_Fortran_FLAGS}")

  CMAKE_FORCE_C_COMPILER(icc "Intel C Compiler")
  CMAKE_FORCE_CXX_COMPILER(icpc "Intel C++ Compiler")
endif(${Toolchain} MATCHES Intel)

# Test files
ADD_SUBDIRECTORY(tst)
SET(tst_exec tst_inter_s)

# Source code files
SET(src gaussian.F90
        hsg_1d.F90
        huygens.F90
        init.F90
        io.F90
        inter.F90
        mur.F90
        pgm.F90
        variables.F90
        yee.F90)

# Test executables
ADD_EXECUTABLE(${tst_exec} ${src})

# Main executable
ADD_EXECUTABLE(${PROJECT_NAME} ${src})

CMakeLists.txt,测试目录

# Test files
SET(tst tst_inter_s.F90)

为编译生成标准 Makefile 我:

  1. 创建一个空的build 目录
  2. build运行cmake -G 'Unix Makefiles' ..
  3. 键入make 编译目标和测试可执行文件

【问题讨论】:

    标签: cmake fortran executable fortran90


    【解决方案1】:

    可执行文件hsg_1dtst_inter_s 是相同的,因为它们包含相同的源文件${src}

    ADD_EXECUTABLE(${tst_exec} ${src})
    ADD_EXECUTABLE(${PROJECT_NAME} ${src})
    

    您是不是忘记在测试可执行文件中添加tst 文件?

    ADD_EXECUTABLE(${tst_exec} ${src} ${tst})
    

    还可以考虑将ADD_EXECUTABLE(${tst_exec} ...) 移动到test/CMakeLists.txt

    【讨论】:

    • 测试可执行文件应该依赖于相同的源文件。这是他们的目标——测试部分源代码模块。将${tst} 添加到ADD_EXECUTABLE(${tst_exec} ${src} ${tst}) 并没有解决问题。将 ADD_EXECUTABLE(${tst_exec} ${src} ${tst}) 移动到 tst/CMakeLists.txt 会导致错误:add_executable called with incorrect number of arguments。我认为是这种情况,因为tst/CMakeLists.txt 不知道${src} 的值。
    • 可能是因为${tst} 没有在主CMakeLists.txt 中定义?尝试使用MESSAGE 命令调试${tst}${src} 里面的内容。
    猜你喜欢
    • 2023-04-01
    • 2016-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多