gpt4 book ai didi

module - 如何修复 CMake Fortran 模块依赖性?

转载 作者:行者123 更新时间:2023-12-05 03:02:42 24 4
gpt4 key购买 nike

您好,我有一个具有以下目录顺序的 Fortran 项目

CMakeLists.txt
src/module_1.f90 (Fortran Modules)
src/module_2.f90
src/... (more files)

module_1.f90 依赖于 module_2.f90。

简化的 CMakeLists.txt 是:

project(MyProject LANGUAGES Fortran)
file(GLOB SOURCES src/*.f90)
add_executable(MyExec SOURCES)

我得到依赖错误:

Fatal Error: Can't open module file ‘module_2.mod’ :for reading at (1): The file or directory doesn't exist.

我试过:

include_directories(src)

没有积极的结果。

如果您在构建目录中搜索:

find . -name "module_2*"

没有任何东西存在,所以 module_2 没有在 module_1 之前编译。为什么会这样?

已编辑:

最后我发现了问题。在 module_1 中,我有一个编译指示(Fortran 最初不支持),如下所示:

#ifdef VAR
module_1_function
#endif

在我的 CMakeLists.txt 中我声明:

 set(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} -DVAR=2")

当 CMake 创建依赖树时,它没有考虑这个变量。要做到这一点,我必须按以下方式做最后一个:

 add_definitions(-DVAR=2)

这解决了问题。

最佳答案

与其将所有 .mod 文件放在一个目录中,对于较大的项目,有一个更简洁的解决方案,即定义一个函数:

function(add_fortran_library LIB)
add_library(${LIB} ${ARGN})

# set module path to LIB_DIR/mod
get_target_property(LIB_DIR ${LIB} BINARY_DIR)
set_target_properties(${LIB} PROPERTIES Fortran_MODULE_DIRECTORY ${LIB_DIR}/mod)

# making LIB_DIR/mod available for libraries linking LIB
target_include_directories(${LIB} INTERFACE ${LIB_DIR}/mod)
endfunction(add_fortran_library)

如果您现在使用 add_fortran_library() 而不是 add_library(),您就不必再关心模块了。

关于module - 如何修复 CMake Fortran 模块依赖性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54549959/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com