Ninja构建因多规则生成mod文件失败,应优先排查何处?
报错信息
[5145/6609] 生成Fortran dyndep文件CMakeFiles\mystran.dir\Fortran.dd
ninja: 构建停止:多个规则生成Binaries/mod/allocated_memory_use_ifs.mod。
关联的Fortran.dd内容
.. build CMakeFiles\\mystran.dir\\Source\\USE_IFs\\ALLOCATED_MEMORY_USE_IFs.f90.obj | Binaries\mod\allocated_memory_use_ifs.mod: dyndep | Binaries\mod\outa_here_interface.mod Binaries\mod\write_alloc_mem_table_interface.mod restat = 1 build CMakeFiles\\mystran.dir\\Source\\UTIL\\ALLOCATED_MEMORY.f90.obj: dyndep | Binaries\mod\allocated_array_data.mod Binaries\mod\allocated_memory_use_ifs.mod Binaries\mod\constants_1.mod Binaries\mod\debug_parameters.mod Binaries\mod\iount1.mod Binaries\mod\params.mod Binaries\mod\pentium_ii_kind.mod Binaries\mod\scontr.mod
优先排查点
检查源文件的模块重复定义:
核对Source/USE_IFs/ALLOCATED_MEMORY_USE_IFs.f90和Source/UTIL/ALLOCATED_MEMORY.f90,确认是否两个文件都定义了allocated_memory_use_ifs模块。正常情况下应该只有前者定义该模块,后者仅通过use语句引用。排查CMake配置的编译规则冲突:
检查项目的CMakeLists.txt,看是否存在重复添加源文件、错误设置模块输出目录,或者让ALLOCATED_MEMORY.f90生成同名模块的配置。比如是否重复调用add_executable/add_library包含目标文件,或者Fortran_MODULE_DIRECTORY配置导致路径冲突。验证依赖生成逻辑:
从dyndep文件内容看,ALLOCATED_MEMORY.f90.obj仅应依赖allocated_memory_use_ifs.mod,而非生成它。确认该文件代码中没有误写module allocated_memory_use_ifs的定义语句。清理缓存重建:
删除CMakeFiles目录和Binaries/mod下的所有模块文件,重新运行cmake ..生成构建文件后再执行ninja,排除缓存依赖导致的错误。
内容的提问来源于stack exchange,提问作者realbabilu

