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
相关产品推荐
相关产品推荐

