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

时间:2019-02-03 12:29:41

标签: c++ windows visual-studio cmake hdf5

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

在为在Linux下已经编写的程序中使用HDF5而编写的CMakeLists.txt下面:

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高级(精简版) )库。

这些库位于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相关的条目:

HDF5 CMake entries

我也在Ubuntu下使用HDF5遇到麻烦(请参见此问题:hdf5.h no such file or directory under Ubuntu and CMake)。

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

如果有人可以给我/我们一个在Windows和Ubuntu上都可以使用的最终解决方案,那就太好了!

2 个答案:

答案 0 :(得分: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})

建议1:当然,有一种方法可以通过find_package来找到Qt5,即

find_package(Qt5 COMPONENTS Core Widgets REQUIRED)

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

建议2:我认为在大多数情况下应避免调用aux_source_directory。而是创建一个源文件的显式列表。

答案 1 :(得分:0)

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