在 Windows 中编写引用 HDF5 的 CMakeLists 的正确方法
proper way to write a CMakeLists referencing HDF5 in Windows
我已经使用 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 下的 link HDF5,我需要 Zlib、Szip(我必须输入它的绝对路径,我不喜欢那样), HDF5 库和 HDF5 高级(精简版)库。
这些库位于 C:\Program Files\HDF_Group\HDF5.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 的问题(请参阅此问题:)。
目前,只有在 CentOS 7 下我没有遇到任何 HDF5 问题。
如果有人能给 me/us 一个同时适用于 Windows 和 Ubuntu 的最终解决方案,那就太好了!
这个解决方案对你有用吗?
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。而是创建一个明确的源文件列表。
对于 libszip,添加 find_library 比添加绝对值 link 更好。对于 ZLib,最好使用 find_library,因为 find_package 将要求您为 CMake 提供 HDF5 不需要的包含目录。最后,ZMQ最好使用find_package,否则,我们需要手动添加条目"ZMQ_LIB_INCLUDE".
我已经使用 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 下的 link HDF5,我需要 Zlib、Szip(我必须输入它的绝对路径,我不喜欢那样), HDF5 库和 HDF5 高级(精简版)库。
这些库位于 C:\Program Files\HDF_Group\HDF5.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 的问题(请参阅此问题:
目前,只有在 CentOS 7 下我没有遇到任何 HDF5 问题。
如果有人能给 me/us 一个同时适用于 Windows 和 Ubuntu 的最终解决方案,那就太好了!
这个解决方案对你有用吗?
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。而是创建一个明确的源文件列表。
对于 libszip,添加 find_library 比添加绝对值 link 更好。对于 ZLib,最好使用 find_library,因为 find_package 将要求您为 CMake 提供 HDF5 不需要的包含目录。最后,ZMQ最好使用find_package,否则,我们需要手动添加条目"ZMQ_LIB_INCLUDE".