在 Eclipse 中编译简单的 HDF5 示例时获取“未定义的引用”

sma*_*ica 5 c eclipse hdf5

我刚刚开始使用 C 和 HDF5,所以我的问题可能很容易回答。

我尝试使用http://beige.ucs.indiana.edu/I590/node122.html中的示例代码来创建 HDF5 文件。

#include "hdf5.h"
#define FILE "file.h5"

main() {

   hid_t       file_id;   /* file identifier */
   herr_t      status;

   /* Create a new file using default properties. */
   file_id = H5Fcreate(FILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);

   /* Terminate access to the file. */
   status = H5Fclose(file_id);
}
Run Code Online (Sandbox Code Playgroud)

我尝试用 Eclipse 编译它并收到 5 条错误消息:

make: *** [Read_HDF5] Error 1
skipping incompatible /usr/lib/libc.so when searching for -lc
undefined reference to `H5check_version'
undefined reference to `H5Fcreate'
undefined reference to `H5Fclose'
Run Code Online (Sandbox Code Playgroud)

什么地方出了错?

谢谢你的帮助!

Sim*_*mon 6

编译时需要链接HDF5库。您收到的错误意味着这些函数的代码丢失,因为您没有链接包含它们的库文件。h5cc最简单的方法是按照您提到的教程中的描述进行编译。否则,如果您更喜欢在 Eclipse 中进行编译,则需要搜索链接器标志设置并添加可以通过h5cc -show在终端中键入找到的正确标志。

例如,对我来说,h5cc -show给出

clang -I/usr/local/include -L/usr/local/Cellar/hdf5/1.8.12/lib /usr/local/Cellar/hdf5/1.8.12/lib/libhdf5_hl.a /usr/local/Cellar/hdf5/1.8.12/lib/libhdf5.a -L/usr/local/lib -lsz -lz -ldl -lm
Run Code Online (Sandbox Code Playgroud)

一点一点:

  • clang是编译器

  • -I/usr/local/include/usr/local/include是一个标志,告诉编译器在目录中搜索头文件

  • -L/usr/local/Cellar/hdf5/1.8.12/lib-L/usr/local/lib是告诉链接器在这些目录中搜索库的标志

  • /usr/local/Cellar/hdf5/1.8.12/lib/libhdf5_hl.a/usr/local/Cellar/hdf5/1.8.12/lib/libhdf5.a是两个 HDF5 静态库的完整路径(告诉链接器链接它们)

  • -lsz-lz-ldl-lm是告诉链接器链接库szzdl和 的标志m

这可能有点矫枉过正了。如果您的 HDF5 安装在标准位置,则只需添加-lhdf5链接器标志就足够了。