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
我已经在 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