【发布时间】:2021-06-04 10:16:36
【问题描述】:
我正在运行一个用于模拟的 fortran 代码,并希望实现一个读取 h5 文件的子例程。即这个带有 readtable.F90 (https://github.com/evanoconnor/EOSdriver) 的 EOSdriver。
我已经安装了 hdf5-library(使用 mpif90 编译器),当我自己编译和运行 EOSdriver 时 - 它工作正常。但后来我通过添加 EOSdriver-files 更改了我的模拟代码的 makefile。添加了所有必要的 HDF5 标志。编译时没有问题。当我尝试链接文件以在模拟中使用 readtable 时,我以某种方式收到以下错误:
/usr/bin/ld: readtable.o: in function `readtable_': readtable.F90:(.text+0xda): undefined reference to `__h5lib_MOD_h5open_f'
/usr/bin/ld: readtable.F90:(.text+0x187): undefined reference to `__h5f_MOD_h5fopen_f'
/usr/bin/ld: readtable.F90:(.text+0x2aa): undefined reference to `__h5d_provisional_MOD_h5dread_integer_scalar'
/usr/bin/ld: readtable.F90:(.text+0x2ee): undefined reference to `__h5d_MOD_h5dopen_f'
/usr/bin/ld: readtable.F90:(.text+0x351): undefined reference to `__h5d_MOD_h5dclose_f'
/usr/bin/ld: readtable.F90:(.text+0x79e): undefined reference to `__h5_dble_interface_MOD_h5dread_double_3'
/usr/bin/ld: readtable.F90:(.text+0x115a): undefined reference to `__h5_dble_interface_MOD_h5dread_double_1'
/usr/bin/ld: readtable.F90:(.text+0x13ed): undefined reference to `__h5_dble_interface_MOD_h5dread_double_scalar'
/usr/bin/ld: readtable.F90:(.text+0x141a): undefined reference to `__h5f_MOD_h5fclose_f'
/usr/bin/ld: readtable.F90:(.text+0x1440): undefined reference to `__h5lib_MOD_h5close_f'
collect2: error: ld returned 1 exit status
我使用的链接命令是:
mpif90 -o ../relaxNS/relaxNS -fdefault-real-8 -fdefault-double-8 -mcmodel=large -fopenmp -O3 -DEQMASS -I/usr/local/include -L/usr/local -lhdf5_fortran -lhdf5 -lz apply_PBC.o (all.o-files...) readtable.o
我是否需要使用其他 hdf5 标志或这里可能出现什么问题?
【问题讨论】:
-
我怀疑库相对于引用库定义的符号的目标文件的排序不正确。传统的链接器行为需要包含符号定义的库来遵循包含符号引用的目标代码。如果是这样 - 有很多重复 - 例如stackoverflow.com/questions/7036158/…