【问题标题】:How to compile a program that need HDF5 library (using Codeblocks)?如何编译需要 HDF5 库的程序(使用 Codeblocks)?
【发布时间】:2017-03-14 18:11:53
【问题描述】:

我有 11 个文件都需要 HDF5 库。通常我只是使用另一种方式来编译和构建该程序。现在我改变主意了,我想自己使用 Codeblocks 来做。

问题来了:

  1. 我在代码块中打开项目中的“构建选项”。然后我直接跳转到链接器设置。并添加所需的 .a 库文件。
  2. 然后我只需单击“重建工作区”。

这里出现错误消息:

gfortran -Jobj/Debug/ -Wall  -g  -O3    -c "/home/shawn/Documents/datafile_oldubuntu/Academics/Data_analysis_code/Helmholtz decomposition+rotcombudget/code_budget/budget_helmholtz_comrot_ver2.0_symmertic/global.f90" -o obj/Debug/global.o

/home/shawn/Documents/datafile_oldubuntu/Academics/Data_analysis_code/Helmholtz decomposition+rotcombudget/code_budget/budget_helmholtz_comrot_ver2.0_symmertic/global.f90:3.4:

USE HDF5
    1

Fatal Error: Can't open module file 'hdf5.mod' for reading at (1): No such file or directory
Process terminated with status 1 (0 minute(s), 1 second(s))
1 error(s), 0 warning(s) (0 minute(s), 1 second(s))

如您所见,在我的编译文件夹中本地没有名为hdf5.mod 的东西。所以这意味着代码块中的链接器选项不起作用。为什么?

【问题讨论】:

  • 您需要告诉编译器在哪里可以找到 HDF5 模块。通常,它们位于包含文件夹中。找到模块文件并将-I/path/to/modules 添加到编译器选项中。
  • @AlexanderVogt 感谢您的回复!我添加了模块文件和库文件,但结果仍然无效。 gfortran -Jobj/Debug/ -Wall -O3 -I/usr/local/hdf5/include -c /home/shawn/Documents/datafile_oldubuntu/Academics/Data_analysis_code/FFT/FFT_spENS/ens.f90 -o obj/Debug/ens。 o
  • 然后我链接:gfortran -o bin/Debug/FFT_spENS obj/Debug/ens.o obj/Debug/fft.o obj/Debug/global.o obj/Debug/main_ens.o /usr /local/hdf5/lib/libhdf5_fortran.a /usr/local/hdf5/lib/libhdf5.a /usr/local/hdf5/lib/libhdf5.a(H5PL.o): 在函数H5PL_term_interface': H5PL.c:(.text+0xa7): undefined reference to dlclose' 所以它仍然某处错了

标签: fortran codeblocks


【解决方案1】:

还要确保您已安装 serial hdf5 库包。这可能会在将来对其他人有所帮助。

在 Ubuntu 上:

sudo apt-get install libhdf5-serial-dev

我收到与您相同的错误,因为我只有 MPI 版本(libhdf5-openmpi-devlibhdf5-mpich-dev

在 MacOS 上:

对于 Fortran,您可能需要部分/全部这些标志:

brew install homebrew/science/hdf5 --with-fortran --with-mpi --with-fortran2003

【讨论】:

    【解决方案2】:

    在编译时需要依赖 hdf5.mod,而不是链接时,这就是为什么您无法通过链接器选项成功修复它的原因。模块文件在概念上有点像 C 包含文件(尽管在实现上非常不同并且不可移植)。要允许编译器找到它们,您可以通过 -I 选项传递搜索路径。

    在代码块中,您应该在您正在处理的链接器选项旁边找到一个search directories 选项卡(在项目构建选项中)。在搜索目录选项卡中,您需要选择编译器选项卡,然后添加 hdf5 模块文件的路径。

    【讨论】:

    • 感谢您的帮助!我想通了编译和链接的过程。
    • 首先是包含预编译的模块。其次是将.o文件与库(.a)文件链接,制作“a.out”
    • 但是我还是做不到...请看:然后我链接:gfortran -o bin/Debug/FFT_spENS obj/Debug/ens.o obj/Debug/fft.o obj/Debug/ global.o obj/Debug/main_ens.o /usr/local/hdf5/lib/libhdf5_fortran.a /usr/local/hdf5/lib/libhdf5.a /usr/local/hdf5/lib/libhdf5.a(H5PL.o ): In function H5PL_term_interface': H5PL.c:(.text+0xa7): undefined reference to dlclose' 所以它在某处仍然是错误的
    • @PabPeter 您可能仍然只是缺少库引用。如果“gfortran 的 HDF5 官方修改版”只是指 h5cc 或类似名称,那只是一个向命令行添加参数的 shell 脚本。您可以查看它将使用哪些选项与h5cc -show
    • 我成功了!谢谢!!解决方案:我 h5fc -show。然后出来:gfortran -I/usr/local/hdf5/include -L/usr/local/hdf5/lib /usr/local/hdf5/lib/libhdf5hl_fortran.a /usr/local/hdf5/lib/libhdf5_hl.a / usr/local/hdf5/lib/libhdf5_fortran.a /usr/local/hdf5/lib/libhdf5.a -L/usr/local/hdf5/lib -ldl -lm -Wl,-rpath -Wl,/usr/local/ hdf5/lib 然后我将它们放入代码块中的链接器命令和编译器命令中。一些警告,但一切都很完美!现在我可以为所欲为!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-09
    • 2014-12-12
    • 1970-01-01
    相关资源
    最近更新 更多