首页 > 解决方案 > 无法使用 HDF5,因为它是由不同版本的 GNU Fortran 创建的

问题描述

我对 HDF5 和 Fortran 90 都很陌生。我正在尝试编译一个在没有 HDF5 的情况下运行良好的程序。我在网上发现我需要使用命令h5fc -show中的标志,输出是这样的

x86_64-conda_cos6-linux-gnu-gfortran -I/home/tmph/anaconda3/include -L/home/tmph/anaconda3/lib /home/tmph/anaconda3/lib/libhdf5hl_fortran.a /home/tmph/anaconda3/lib/ libhdf5_hl.a /home/tmph/anaconda3/lib/libhdf5_fortran.a /home/tmph/anaconda3/lib/libhdf5.a -L/home/tmph/anaconda3/lib -Wl,-O2 -Wl,--sort-common -Wl,--按需 -Wl,-z,relro -Wl,-z,now -Wl,--disable-new-dtags -Wl,-rpath,/home/tmph/anaconda3/lib -L/home /tmph/anaconda3/lib -lrt -lpthread -lz -ldl -lm -Wl,-rpath -Wl,/home/tmph/anaconda3/lib

(我的大部分日常工作实际上是在 Python 中,因此是 anaconda3)

我尝试编译

[...]
LDLIBS=-lhdf5_fortran -lhdf5 
LDINC=-I/home/tmph/anaconda3/include
LDFLAGS=-L/home/tmph/anaconda3/lib

$(OBJ_DIR)%.o: $(SRC_DIR)%.F90
    $(FC) $(FCFLAGS) $(LDINC) -c $< -J $(SRC_DIR) -o $@

exec: $(SOURCE_OBJECTS) $(MAIN_OBJECT)
    $(LC) $(FCFLAGS) $(LDINC) -o $(exec_name) $^ $(LDFLAGS) $(LDLIBS)

但我遇到了错误

12 | 使用 HDF5 | 1 致命错误:无法读取在 (1) 处打开的模块文件“/home/tmph/anaconda3/include/hdf5.mod”,因为它是由不同版本的 GNU Fortran 编译终止创建的。

当我运行时,gfortran --version我得到输出

GNU Fortran (GCC) 10.2.0 版权所有 (C) 2020 Free Software Foundation, Inc. 这是免费软件;查看复制条件的来源。没有保修;甚至不考虑适销性或特定用途的适用性。

但我不知道如何检查 anaconda 中 hdf5.mod 文件使用的版本。它来自 Anaconda 是否有问题?我需要安装另一个吗?如果是这样,怎么做?我必须以某种方式重建模块(这会弄乱一些python包)吗?也许我需要使用更多的标志?(我使用了我认为有意义的,类似于我在 github 上找到的 makefile,例如这个

我也尝试修改一个示例Makefile,但我没有我所知道的 libz.a 或 libsz.a ,最后我得到了同样的错误。

我正在运行 Manjaro,以防万一。我还尝试使用 安装 HDF5 pacman -S hdf5,它可以工作但没有改变任何东西。

编辑:事实证明,当您安装 Anaconda 时,它会将 acanconda3/bin 添加到路径的前面。这包含一个过时的 h5fc 版本,这就是混乱的来源。如果我使用 /usr/bin/h5fc 的输出,则编译运行没有任何问题。

标签: compiler-errorsfortrangfortranhdf5fortran90

解决方案


标志不会解决这个问题。您需要对程序中的所有模块使用相同版本的 gfortran。如果您想保留您的版本哦 HFD,您需要获得相同的 gfortran 版本。

.mod您可以通过读取文件的第一行并读取模块编号来找出文件的 gfortran 版本。然后您可以继续查看此处的表格是否可以确定哪个 Fortran 编译器生成了“.mod”文件?


推荐阅读