You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

编译ViennaTS时提示缺失HDF5 C++库的解决方法咨询

编译ViennaTS时HDF5 C++库检测失败的问题与解决

我在编译ViennaTS软件时,进入/ViennaTS/build目录执行:

cmake ..

执行后出现错误,提示缺少HDF5 C++库,完整错误输出如下:

-- The C compiler identification is GNU 11.4.0
-- The CXX compiler identification is GNU 11.4.0
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working C compiler: /usr/bin/cc - skipped
-- Detecting C compile features
-- Detecting C compile features - done
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: /usr/bin/c++ - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Found OpenMP_C: -fopenmp (found version "4.5")
-- Found OpenMP_CXX: -fopenmp (found version "4.5")
-- Found OpenMP: TRUE (found version "4.5")
-- Found Boost: /usr/lib/x86_64-linux-gnu/cmake/Boost-1.74.0/BoostConfig.cmake (found suitable version "1.74.0", minimum required is "1.46.0")
-- Found SPRNG: /home/ishitanaken23/sprng/lib/libsprng.a
-- Found HDF5: /usr/lib/x86_64-linux-gnu/hdf5/serial/libhdf5_cpp.so;/usr/lib/x86_64-linux-gnu/hdf5/serial/libhdf5.so;/usr/lib/x86_64-linux-gnu/libcrypto.so;/usr/lib/x86_64-linux-gnu/libcurl.so;/usr/lib/x86_64-linux-gnu/libpthread.a;/usr/lib/x86_64-linux-gnu/libsz.so;/usr/lib/x86_64-linux-gnu/libz.so;/usr/lib/x86_64-linux-gnu/libdl.a;/usr/lib/x86_64-linux-gnu/libm.so (found version "1.10.7") found components: CXX
CMake Error at CMakeLists.txt:69 (message):
  Missing HDF5 C++ library

CMakeLists.txt中关于HDF5的配置如下,错误由HDF5_hdf5_cpp_LIBRARY变量未被识别触发:

# HDF5
FIND_PACKAGE(HDF5 COMPONENTS CXX)
IF(HDF5_FOUND)
  IF(HDF5_hdf5_cpp_LIBRARY)
    add_definitions(-DUSE_HDF5)
    add_definitions(${HDF5_DEFINITIONS})
    INCLUDE_DIRECTORIES(${HDF5_INCLUDE_DIRS})
    SET(LIBRARIES ${LIBRARIES} ${HDF5_LIBRARIES})
  ELSE(HDF5_hdf5_cpp_LIBRARY)
    message(FATAL_ERROR "Missing HDF5 C++ library")
  ENDIF(HDF5_hdf5_cpp_LIBRARY)
ELSE(HDF5_FOUND)
  message(STATUS "Missing HDF5 library: ViennaTS will be built without TDR file support")
ENDIF(HDF5_FOUND)

查看CMakeCache,已确认HDF5 C++库路径正确,但变量名与CMakeLists.txt中使用的不一致:

//HDF5 CXX Wrapper compiler.  Used only to detect HDF5 compile
// flags.
HDF5_CXX_COMPILER_EXECUTABLE:FILEPATH=/usr/bin/h5c++

//Path to a library.
HDF5_CXX_LIBRARY_crypto:FILEPATH=/usr/lib/x86_64-linux-gnu/libcrypto.so

//Path to a library.
HDF5_CXX_LIBRARY_curl:FILEPATH=/usr/lib/x86_64-linux-gnu/libcurl.so

//Path to a library.
HDF5_CXX_LIBRARY_dl:FILEPATH=/usr/lib/x86_64-linux-gnu/libdl.a

//Path to a library.
HDF5_CXX_LIBRARY_hdf5:FILEPATH=/usr/lib/x86_64-linux-gnu/hdf5/serial/libhdf5.so

//Path to a library.
HDF5_CXX_LIBRARY_hdf5_cpp:FILEPATH=/usr/lib/x86_64-linux-gnu/hdf5/serial/libhdf5_cpp.so

//Path to a library.
HDF5_CXX_LIBRARY_m:FILEPATH=/usr/lib/x86_64-linux-gnu/libm.so

//Path to a library.
HDF5_CXX_LIBRARY_pthread:FILEPATH=/usr/lib/x86_64-linux-gnu/libpthread.a

//Path to a library.
HDF5_CXX_LIBRARY_sz:FILEPATH=/usr/lib/x86_64-linux-gnu/libsz.so

//Path to a library.
HDF5_CXX_LIBRARY_z:FILEPATH=/usr/lib/x86_64-linux-gnu/libz.so

//HDF5 file differencing tool.
HDF5_DIFF_EXECUTABLE:FILEPATH=/usr/bin/h5diff

//The directory containing a CMake configuration file for HDF5.
HDF5_DIR:PATH=HDF5_DIR-NOTFOUND

解决方法

  • 修改CMakeLists.txt兼容新旧变量名
    问题根源是CMakeLists.txt使用了旧版本FindHDF5模块的变量名HDF5_hdf5_cpp_LIBRARY,而当前环境中CMake使用的是新命名HDF5_CXX_LIBRARY_hdf5_cpp。修改CMakeLists.txt中的检测逻辑,兼容两种变量:

    # HDF5
    FIND_PACKAGE(HDF5 COMPONENTS CXX)
    IF(HDF5_FOUND)
      # 兼容新旧CMake的HDF5变量命名
      SET(HDF5_CPP_LIBRARY "" CACHE INTERNAL "HDF5 C++ library path")
      IF(HDF5_hdf5_cpp_LIBRARY)
        SET(HDF5_CPP_LIBRARY ${HDF5_hdf5_cpp_LIBRARY})
      ELSEIF(HDF5_CXX_LIBRARY_hdf5_cpp)
        SET(HDF5_CPP_LIBRARY ${HDF5_CXX_LIBRARY_hdf5_cpp})
      ENDIF()
    
      IF(HDF5_CPP_LIBRARY)
        add_definitions(-DUSE_HDF5)
        add_definitions(${HDF5_DEFINITIONS})
        INCLUDE_DIRECTORIES(${HDF5_INCLUDE_DIRS})
        SET(LIBRARIES ${LIBRARIES} ${HDF5_LIBRARIES})
      ELSE()
        message(FATAL_ERROR "Missing HDF5 C++ library")
      ENDIF()
    ELSE(HDF5_FOUND)
      message(STATUS "Missing HDF5 library: ViennaTS will be built without TDR file support")
    ENDIF(HDF5_FOUND)
    
  • 手动指定HDF5的CMake配置路径
    如果系统中存在HDF5的CMake配置文件,执行cmake时手动指定HDF5_DIR参数:

    cmake .. -DHDF5_DIR=/usr/lib/x86_64-linux-gnu/hdf5/serial/cmake
    

    (路径需根据实际系统调整,通常HDF5的CMake配置文件位于lib目录下的cmake子文件夹)

  • 跳过HDF5检测(编译不带TDR支持的版本)
    若无需TDR文件支持,可修改CMakeLists.txt注释掉HDF5的强制检测逻辑,或执行cmake时添加参数:

    cmake .. -DHDF5_FOUND=FALSE
    

内容的提问来源于stack exchange,提问作者Shuto

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 13:35:00