无法使用 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,--as-needed -Wl,-z,relro -Wl,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 自由软件基金会, Inc. 这是免费软件;请参阅复制条件的来源。 没有保修;甚至不是为了适销性或适合性 特殊目的。

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

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

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

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

解决方法

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

可以通过读取文件的第一行和读取模块号来找出.mod文件的gfortran版本。然后你可以继续到这里的桌子Is it possible to determine which Fortran compiler generated a ".mod" file?