hdf5.h Ubuntu 和 CMake 下没有这样的文件或目录

hdf5.h no such file or directory under Ubuntu and CMake

我已经在 Ubuntu 下安装了 HDF5 :

sudo apt install libhdf5-dev

我有一个使用 HDF5 的 Qt 程序,它在 CentOS 7 下可以正常编译,但在 Ubuntu 下不能:

erreur : hdf5.h: No such file or directory #include ^~~~~~~~

我正在使用 CMake 生成构建文件,在其中,我不需要为 CentOS 构建处理 HDF5。

我将网上找到的这部分添加到CMake脚本中,但仍然存在编译错误。

FIND_PACKAGE(ZLIB)
FIND_LIBRARY(HDF5_LIBRARY hdf5 ...)
FIND_LIBRARY(HDF5_HL_LIBRARY hdf5_hl ...)
IF(NOT TARGET hdf5 AND NOT TARGET hdf5_hl)
    ADD_LIBRARY(hdf5 SHARED IMPORTED)
    ADD_LIBRARY(hdf5_hl SHARED IMPORTED)
ENDIF()
SET_TARGET_PROPERTIES(hdf5 PROPERTIES IMPORTED_LOCATION ${HDF5_LIBRARY})
SET_TARGET_PROPERTIES(hdf5_hl PROPERTIES IMPORTED_LOCATION
                                         ${HDF5_HL_LIBRARY})
SET(HDF5_LIBRARIES hdf5 hdf5_hl ${ZLIB_LIBRARIES} m)

我可以在脚本中添加什么来修复包含问题?

和"locate",我发现不一样hdf5.h:

/usr/include/hdf5/mpich/hdf5.h
/usr/include/hdf5/openmpi/hdf5.h
/usr/include/hdf5/serial/hdf5.h

我真的很想知道 "libhdf5-dev" 指的是什么?以及为什么 Ubuntu 下没有正确提供 HDF5(太疯狂了!)

imported targets 的文档中所示,您还必须填充 INTERFACE_INCLUDE_DIRECTORIES 以指定 headers 位置。您可能还想为 HL 添加依赖项 INTERFACE_LINK_LIBRARIES.

所以应该是这样的:

SET_TARGET_PROPERTIES(hdf5 PROPERTIES INTERFACE_INCLUDE_DIRECTORIES ${HDF5_INCLUDE_DIRS})

我认为这也是您要正确指定的那个:

SET_TARGET_PROPERTIES(hdf5 PROPERTIES INTERFACE_LINK_LIBRARIES ${ZLIB_LIBRARIES} m)
SET_TARGET_PROPERTIES(hdf5_hl PROPERTIES INTERFACE_LINK_LIBRARIES hdf5)

而不是你的 HDF5_LIBRARIES 更改。

在Ubuntu下,我被迫在CMake脚本中添加了MPI。我不喜欢这个解决方案,但它的 CMake 和 Ubuntu 错误...

find_package(HDF5)
find_package(MPI)

....

target_link_libraries(${binary} ${MPI_LIBRARIES} ${HDF5_LIBRARIES} ... )

target_include_directories(${binary} PRIVATE ${HDF5_INCLUDE_DIRS})

还有这个问题:

libhdf5-dev 实际上是串行版本 https://packages.ubuntu.com/xenial/amd64/libhdf5-dev/filelist