Module 如何修复CMake Fortran模块依赖关系?

Module 如何修复CMake Fortran模块依赖关系?,module,cmake,fortran,dependencies,Module,Cmake,Fortran,Dependencies,嗨,我有一个Fortran项目,目录顺序如下 CMakeLists.txt src/module_1.f90 (Fortran Modules) src/module_2.f90 src/... (more files) 模块1.f90依赖于模块2.f90 简化的CMakeLists.txt是: project(MyProject LANGUAGES Fortran) file(GLOB SOURCES src/*.f90) add_executable(MyExec SOURCES)

嗨,我有一个Fortran项目,目录顺序如下

CMakeLists.txt
src/module_1.f90     (Fortran Modules)
src/module_2.f90
src/... (more files)
模块1.f90依赖于模块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*"
不存在任何内容,因此模块_2不会在模块_1之前编译。为什么会发生这种情况

编辑:

最后我发现了问题。在
module_1
中,我有一个pragma(Fortran最初不支持它),类似于:

#ifdef VAR
    module_1_function
#endif
在我的CMakeLists.txt中,我声明:

 set(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} -DVAR=2")
当CMake创建依赖关系树时,它没有考虑这个变量。为了做好这件事,我必须用以下方式做最后一件事:

 add_definitions(-DVAR=2)

这解决了问题。

您必须告诉CMake在哪里放置和查找模块

我使用以下方法,但具体位置当然取决于您

set(CMAKE_Fortran_MODULE_DIRECTORY ${CMAKE_BINARY_DIR}/modules)

在任何
include_directory
add_executable
命令前面放置一行。

不要将所有.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(),则不必再关心模块。

问题仍然存在。现在文件夹
modules
已出现在
build
目录中,但
module_2.mod
不存在。有关进一步调试,请1。从生成目录中删除所有文件(以删除缓存),然后重新运行cmake以获得干净的生成和2。尝试明确列出文件:
add_可执行文件(MyExec src/module_1.f90 src/module_2.f90 src/main_program.f90
)例如。嗨,Pierre我尝试了第一个并继续。第二个更复杂,因为这是一个包含大约500个源文件的大型项目。我只写了一个简化的项目。什么版本的cmake?一个可执行文件还是几个?请不要在多个问题下发布相同的答案。如果问题相同,则应将其链接为重复问题。如果它们不相同,请调整答案以适合实际问题。