You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

CMake多版本Fortran *.mod文件冲突问题解决方案咨询

解决Fortran多目标编译时mod文件冲突的CMake方案

核心思路

给每个编译目标指定独立的模块输出目录,让不同预编译选项生成的mod文件各归其位,从根源避免冲突,同时规避并行构建的竞争问题。

具体实现步骤

  • 为每个目标单独设置模块输出目录:
    使用Fortran_MODULE_DIRECTORY目标属性,将每个目标的mod文件生成到专属子目录中。示例代码:
    # 定义目标A,带预编译选项A
    add_executable(target_A src/main.f90 src/module.f90)
    target_compile_options(target_A PRIVATE -DPRECOMPILER_OPTION_A)
    # 指定目标A的mod文件输出目录
    set_target_properties(target_A PROPERTIES
        Fortran_MODULE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/mods/target_A"
    )
    # 让目标A能找到自己生成的mod文件
    target_include_directories(target_A PRIVATE "${CMAKE_CURRENT_BINARY_DIR}/mods/target_A")
    
    # 定义目标B,带预编译选项B
    add_executable(target_B src/main.f90 src/module.f90)
    target_compile_options(target_B PRIVATE -DPRECOMPILER_OPTION_B)
    set_target_properties(target_B PROPERTIES
        Fortran_MODULE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/mods/target_B"
    )
    target_include_directories(target_B PRIVATE "${CMAKE_CURRENT_BINARY_DIR}/mods/target_B")
    
  • 处理跨目标依赖:
    如果某个目标依赖另一个目标生成的mod文件,直接引用依赖目标的模块目录即可。比如目标C依赖target_A的mod:
    add_executable(target_C src/use_module.f90)
    target_include_directories(target_C PRIVATE
        $<TARGET_PROPERTY:target_A,Fortran_MODULE_DIRECTORY>
    )
    add_dependencies(target_C target_A)
    

方案优势

  • 每个目标的mod文件完全隔离在独立目录,不会因预编译选项不同而互相覆盖;
  • 无需后期移动文件,从编译阶段就直接生成到目标目录,彻底避免并行构建时的文件竞争;
  • CMake会自动处理模块目录的创建,无需手动维护目录结构。

内容的提问来源于stack exchange,提问作者Addman

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 05:57:58