GCC10环境编译SURFEX模型grib_api依赖出现Fortran实参类型不匹配错误求助
问题根本原因
你观察执行make后输出的这行命令:
cd /home/eccei339/snellius_surfex/open_SURFEX_V8_1/src/LIB/grib_api-1.17.0-Source && LDFLAGS= FCFLAGS= CPPFLAGS="" \ ./configure --disable-jpeg --prefix=/home/eccei339/snellius_surfex/open_SURFEX_V8_1/src/LIB/grib_api-1.17.0-Source-LXgfortran FC="gfortran" && \ ...
SURFEX的内置编译脚本显式清空了FCFLAGS、CPPFLAGS等变量,你在步骤2导出的编译参数没有传递到grib_api的编译过程中,因此不生效。
可行解决方案(按操作复杂度从低到高排序)
方案1:切换低版本GCC编译(最适合初学者)
GCC 9及更早版本默认不开启 Fortran 实参类型不匹配的严格校验,直接替换编译器版本即可解决问题:
- 清空之前的编译缓存,回到步骤2的环境配置环节
- 替换GCC加载命令为低版本,比如:
module load GCC/9.5.0
- 后续步骤和官方指引完全一致,重新编译即可。
方案2:修改SURFEX内置grib_api的编译参数
直接修改SURFEX中调用grib_api编译的规则,把忽略参数不匹配的参数加进去:
- 打开SURFEX源码路径下的
src/Makefile.SURFEX.mk文件(或者对应你架构的Rules.LXgfortran.mk文件) - 找到编译grib_api的命令段,把其中的
FCFLAGS=修改为:
FCFLAGS="-w -fallow-argument-mismatch -O2"
同时在同一段加上FFLAGS="-w -fallow-argument-mismatch -O2"
3. 清空之前的编译缓存,重新执行make即可。
方案3:预编译独立的grib_api库
提前单独编译好grib_api 1.17.0版本,再让SURFEX调用现成的库,避免走内置编译逻辑:
- 单独下载grib_api 1.17.0源码,编译时加入所需参数:
export FCFLAGS="-w -fallow-argument-mismatch -O2" export FFLAGS="-w -fallow-argument-mismatch -O2" ./configure --prefix=/your/install/path --disable-jpeg FC=gfortran make && make install
- 修改SURFEX的配置文件,添加grib_api的头文件、库文件路径,关闭内置grib_api编译选项即可。
内容的提问来源于stack exchange,提问作者Xu Shan
相关产品推荐
相关产品推荐

