编译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
相关产品推荐
相关产品推荐

