Fortran编译报Mismatch in components of derived type错误求解
报错含义
该报错属于gfortran的模块派生类型虚表校验不匹配错误:
当编译器处理use SIO_ncSpatialFile_mod语句时,会校验该模块依赖的所有上游模块派生类型定义一致性。你当前编译的测试单元文件,和已经编译好的SIO_ncSpatialFile_mod模块文件,读取到的SHR_datetime_mod中clock/calendar派生类型的虚函数表组件顺序、成员存在差异,因此触发致命错误。
你未修改datetime相关代码仍触发报错,核心原因是编译缓存不一致,和代码逻辑本身无关:
你修改测试文件后仅触发了测试单元的增量编译,而依赖的SIO前缀模块库是之前用旧的SHR_datetime_mod编译产物编译的,两边拿到的派生类型虚表定义对不上,就会出现这类看似莫名其妙的成员不匹配提示。
排查解决步骤
- 第一步优先执行全量清理重编:删除所有编译生成的
.mod、.o文件,CMake项目直接删除整个build目录,重新配置编译,90%以上的这类问题都会被解决 - 检查项目头文件搜索路径是否存在重复的
SHR_datetime_mod定义:确认全局只有soulshared目录下的一份datetime_mod.F90,没有散落的旧版本SHR_datetime_mod.mod文件被编译器优先读取 - 校验编译依赖顺序:确保编译链顺序为「SHR公共库全量编译完成 → SIO前缀模块库编译 → 测试单元编译」,禁止下游模块提前读取未编译完成的上游mod文件
内容的提问来源于stack exchange,提问作者rgrun
相关产品推荐
相关产品推荐

