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

编译netcdf-fortran-4.2时库符号尾部下划线差异问题排查

问题:NetCDF-Fortran 4.2编译后符号命名不兼容导致XIOS编译失败

背景信息

  • 迁移目标:使用Intel Fortran重新编译netcdf-fortran-4.2
  • 已完成前置依赖构建:hdf5-1.8.11、netcdf-4.3.0
  • 编译环境:HPC集群,通过module加载依赖,源码取自GitHub
  • 编译执行的Ansible脚本片段:
source /etc/profile.d/modules.sh
export MODULEPATH={{ modulefiles_dir }}:$MODULEPATH
module load netcdf-4.3.0
autoreconf -i
./configure --prefix={{ install_dir }}/intel18/intelmpi2018/netcdf-4.3.0 CC=mpiicc CFLAGS=-march=core-avx2 FC=mpiifort FCFLAGS=-march=core-avx2

符号差异现象

编译无报错,但通过nm对比新构建与现有libnetcdff.so的符号,发现关键差异:

新构建库符号示例

...
000000000006dec0 T netcdf_mp_nf90_var_par_access_
                 U nf_abort_
0000000000012470 T nf_abort__
                 U nf_close_
0000000000011fc0 T nf_close__
...

现有库符号示例

...
000000000006c0e0 T netcdf_mp_nf90_var_par_access_
0000000000010690 T nf_abort_
00000000000101e0 T nf_close_
...

后续编译旧版本XIOS(1.0_rel660)时出现大量未定义符号错误,原因是XIOS依赖单下划线结尾的符号,而新库导出的是双下划线结尾的实现符号。已知唯一变量是autoconf版本(新编译用2.69,旧版本用2.66),编译器版本一致。

解决思路

  • 强制Intel Fortran使用单下划线符号规则:在configure的FCFLAGS中添加-assume underscore参数,强制编译器生成单下划线结尾的符号,修改后的configure命令:
./configure --prefix={{ install_dir }}/intel18/intelmpi2018/netcdf-4.3.0 CC=mpiicc CFLAGS=-march=core-avx2 FC=mpiifort FCFLAGS="-march=core-avx2 -assume underscore"
  • 回退autoconf版本至2.66:既然符号差异由autoconf版本变化导致,使用旧版本autoconf重新生成配置脚本:
    1. 切换到autoconf 2.66(通过module加载或本地安装)
    2. 重新执行autoreconf -i生成配置文件
    3. 重新运行configure、make、make install流程
  • 检查NetCDF专属配置选项:部分NetCDF版本提供了符号命名相关的configure参数,例如--enable-fortran-underscore,可尝试添加该参数强制生成单下划线符号
  • 提前验证符号一致性:编译完成后,用nm -D libnetcdff.so | grep -E "nf_abort_|nf_close_"确认目标符号存在,再进行XIOS的编译

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 09:07:40