编译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重新生成配置脚本:
- 切换到autoconf 2.66(通过module加载或本地安装)
- 重新执行
autoreconf -i生成配置文件 - 重新运行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
相关产品推荐
相关产品推荐

