在 Windows 中编写引用 HDF5 的 CMakeLists 的正确方法

Posted

技术标签:

【中文标题】在 Windows 中编写引用 HDF5 的 CMakeLists 的正确方法【英文标题】:proper way to write a CMakeLists referencing HDF5 in Windows 【发布时间】:2019-06-27 09:47:57 【问题描述】:

我已经使用 CMake 在 Windows 下下载了一个内置的 HDF5,我还生成了一个安装程序来将其安装在 Program Files 下。

在我编写的 CMakeLists.txt 下方,以便能够在我已经在 Linux 下编写的程序中使用 HDF5:

cmake_minimum_required(VERSION 2.8)

project(Hdf5DataFeed)

add_definitions(-DWINDOWS)

find_package(HDF5)
FIND_LIBRARY(HDF5_HL_LIBRARY hdf5_hl)
FIND_LIBRARY(ZLIB zlib)
find_library(ZMQ_LIB zmq)

find_package(VTK REQUIRED)
include($VTK_USE_FILE)

include_directories($ZMQ_LIB_INCLUDE)

aux_source_directory(. SRC_LIST)
add_executable($PROJECT_NAME $SRC_LIST)

target_link_libraries($PROJECT_NAME $ZLIB "C:/Program Files/HDF_Group/HDF5/1.10.1/lib/libszip.lib"  $VTK_LIBRARIES $ZMQ_LIB $HDF5_LIBRARIES $HDF5_HL_LIBRARY Qt5::Core Qt5::Gui Qt5::Widgets)

target_include_directories($PROJECT_NAME PRIVATE $HDF5_INCLUDE_DIRS)

正如您在上面看到的,要在 Visual Studio 下链接 HDF5,我需要 Zlib、Szip(我必须输入它的绝对路径,我不喜欢那样)、HDF5 库和 HDF5 High Level(Lite ) 库。

这些库位于 C:\Program Files\HDF_Group\HDF5\1.10.1\lib 下:

libhdf5.lib <============
libhdf5.settings
libhdf5_cpp.lib
libhdf5_hl.lib <=====
libhdf5_hl_cpp.lib
libhdf5_tools.lib
libszip.lib <=== ????
libzlib.lib <====

我使用 CMake-Gui 来通知 CMake 库路径(除了 Szip,我不知道为什么 CMake 不知道它,以及为什么我不能只提供 CMake 库目录而不是指出其中几个人的路径)。

我想使用 CMake-GUI 来通知 CMake 的 Szip 库路径,但这最后并没有创建它的条目,我只有这些与 HDF5 相关的条目:

我在 Ubuntu 下也遇到了 HDF5 的问题(请参阅这个问题:hdf5.h no such file or directory under Ubuntu and CMake)。

目前,我只是在 CentOS 7 下没有遇到 HDF5 的任何问题。

如果有人能给我/我们提供一个适用于 Windows 和 Ubuntu 的最终解决方案,那就太好了!

【问题讨论】:

【参考方案1】:

此解决方案对您有用吗?

cmake_minimum_required(VERSION 2.8)
project(Hdf5DataFeed)

# necessary?
add_definitions(-DWINDOWS)

find_package(HDF5 REQUIRED COMPONENTS C CXX HL)
find_package(ZLIB REQUIRED)
find_package(VTK REQUIRED)
include($VTK_USE_FILE)
find_library(ZMQ_LIB zmq)

include_directories($ZMQ_LIB_INCLUDE $HDF5_INCLUDE_DIR 
  $ZLIB_INCLUDE_DIRS)

aux_source_directory(. SRC_LIST)
add_executable($PROJECT_NAME $SRC_LIST)

target_link_libraries($PROJECT_NAME $HDF5_LIBRARIES
  $HDF5_HL_LIBRARIES $ZLIB_LIBRARIES $VTK_LIBRARIES 
  Qt5::Core Qt5::Gui Qt5::Widgets $ZMQ_LIB)

建议一:当然有办法通过find_package找到Qt5,即

find_package(Qt5 COMPONENTS Core Widgets REQUIRED)

然后将正确的变量添加到 include_directories 和 target_link_libraries。不过,不确定 zmq 库是否存在这种可能性。

建议 2: 我认为在大多数情况下应该避免调用 aux_source_directory。改为创建一个明确的源文件列表。

【讨论】:

我的 Windows PC 不正确,明天我会检查它!谢谢。【参考方案2】:

对于 libszip,添加 find_library 比添加绝对链接要好。对于 ZLib,最好使用 find_library,因为 find_package 将要求您向 CMake 提供 HDF5 不需要的包含目录。最后,ZMQ最好使用find_package,否则,我们需要手动添加条目“ZMQ_LIB_INCLUDE”。

【讨论】:

以上是关于在 Windows 中编写引用 HDF5 的 CMakeLists 的正确方法的主要内容,如果未能解决你的问题,请参考以下文章

HDF5 用于使用 fortran 编写的数据文件

在 Windows 上使用带有 CMake 的 HDF5 库(错误:“找不到 HDF5”)

使用 Java Native Library 在 HDF5 中编写交错数组

(C++) 在 HDF5 中编写数据库

如何在 HDF5 中编写固定长度的字符串?

如何在带有 NetBeans 的 Windows Java 项目中使用 HDF5