Makefile 带有HDF5的Fortran代码的生成文件中存在未定义的引用错误

Makefile 带有HDF5的Fortran代码的生成文件中存在未定义的引用错误,makefile,fortran,hdf5,undefined-reference,Makefile,Fortran,Hdf5,Undefined Reference,我正在尝试编译一个使用HDF5的Fortran 90代码。为此,我使用以下Makefile: # Location of HDF5 binaries (with include/ and lib/ underneath) HDF5 = /fs/posgrado16/other0/guido/libraries/hdf5/serial # Compiler FC = gfortran # ------ No machine-specific paths/variables after

我正在尝试编译一个使用HDF5的Fortran 90代码。为此,我使用以下Makefile:

# Location of HDF5 binaries (with include/ and lib/ underneath)
HDF5 = /fs/posgrado16/other0/guido/libraries/hdf5/serial
# Compiler
FC        = gfortran
# ------ No machine-specific paths/variables after this  -----
FORTRANLIB=-I$(HDF5)/include $(HDF5)/lib/libhdf5_fortran.a

FSOURCE = h5_crtgrpar.f90
OBJECTS = $(FSOURCE:.f90=.o)
EXECUTABLE = $(FSOURCE:.f90=.exe)
LIBSHDF = $(FORTRANLIB) $(HDF5)/lib/libhdf5.a


all:$(EXECUTABLE)


$(EXECUTABLE):$(OBJECTS)
    $(FC) -o $@ $^ $(LIBSHDF)

$(OBJECTS):$(FSOURCE)
    $(FC) -c $@ $< $(LIBSHDF)


.PHONY : clean

 clean:
    rm -f $(FSOURCE) $(OBJECTS) *.h5

我不知道是什么错误。我的Makefile可能有问题。

要编译启用HDF5的Fortran代码,可以替换

FC        = gfortran

并跳过所有hdf5标志,因为h5fc包装器将处理这些标志

如果您有特定的理由按编译器的名称调用编译器,您可以通过调用

h5fc -show
这将显示向编译器添加的标志

在我的带有gfortran的linux计算机上,结果是:

gfortran -g -O2 -fstack-protector-strong -I/usr/include/hdf5/serial -L/usr/lib/x86_64-linux-gnu/hdf5/serial /usr/lib/x86_64-linux-gnu/hdf5/serial/libhdf5hl_fortran.a /usr/lib/x86_64-linux-gnu/hdf5/serial/libhdf5_hl.a /usr/lib/x86_64-linux-gnu/hdf5/serial/libhdf5_fortran.a /usr/lib/x86_64-linux-gnu/hdf5/serial/libhdf5.a -Wl,-z,relro -lpthread -lz -ldl -lm -Wl,-rpath -Wl,/usr/lib/x86_64-linux-gnu/hdf5/serial
通常情况下,你可以通过一些实验找到比这更少的标志


由于您报告了错误消息,您缺少启用动态链接库链接的-ldl标志,请参阅以获取其他信息。

欢迎,请务必阅读和。对于所有Fortran问题,请使用tag。Fortran 90只是其中一个版本。File.f90并不意味着Fortran 90,但是任何版本的自由格式文件,但没有代码的确切版本是完全不重要的。要理解什么是未定义的引用,请参阅,了解这一点非常重要。你不也需要-lz吗?嘿,所有人,我相信这不是重复的。使用HDF5是一个典型的Fortran计算用例,这里提出的问题比建议的重复问题更有可能在google搜索中弹出。这不是重复的问题!标记为答案的问题太笼统,没有提供答案,它只是给出了导致问题的可能原因。抱歉,我不想使用自定义包装器仅用于包含hdf5。h5fc-show是有用的,但在我看来,它只用于诊断原始问题。我个人使用cmake和FindHDF5实用程序。对于小项目,我使用h5fc,看不出有什么问题。谢谢Pierre,在变量FORTRANLIB中使用h5fc-show的输出解决了这个问题。
h5fc -show
gfortran -g -O2 -fstack-protector-strong -I/usr/include/hdf5/serial -L/usr/lib/x86_64-linux-gnu/hdf5/serial /usr/lib/x86_64-linux-gnu/hdf5/serial/libhdf5hl_fortran.a /usr/lib/x86_64-linux-gnu/hdf5/serial/libhdf5_hl.a /usr/lib/x86_64-linux-gnu/hdf5/serial/libhdf5_fortran.a /usr/lib/x86_64-linux-gnu/hdf5/serial/libhdf5.a -Wl,-z,relro -lpthread -lz -ldl -lm -Wl,-rpath -Wl,/usr/lib/x86_64-linux-gnu/hdf5/serial