CMakeLists 无法找到新安装的 HDF5?

use*_*619 3 linux boost makefile cmake

我正在开发一个可以在另一台计算机(第一台)上运行的程序,并试图让它在我的新计算机(第三台)上运行。当我转到build并键入时ccmake ..,出现此错误:

CMake Error at build/share/cmake/hdf5/hdf5-targets.cmake:67 (message):
   The imported target "hdf5" references the file


 "/home/myname/Desktop/MyProject/build/lib/libhdf5.a"

   but this file does not exist.  Possible reasons include:

   * The file was deleted, renamed, or moved to another location.

   * An install or uninstall procedure did not complete successfully.

   * The installation package was faulty and contained


 "/home/myname/Desktop/MyProject/build/share/cmake/hdf5/h
df5-targets.cmake"

   but not all the files it references.

 Call Stack (most recent call first):
   build/share/cmake/hdf5/hdf5-config.cmake:70 (INCLUDE)
   build/share/cmake/hdf5/FindHDF5.cmake:85 (INCLUDE)
   src/Thing/CMakeLists.txt:66 (find_package)
Run Code Online (Sandbox Code Playgroud)

即使我随后使用 sudo apt-get 安装了 hdf5,我也遇到了同样的错误

我不得不删除该lib目录,因为它包含过时的 boost 文件并导致大量错误,这可能是因为我在这台新计算机中usr/libusr/include上新安装了 boost 文件后发生了冲突。通过简单地删除该lib目录,我让这个程序在第二台计算机上运行

解决这个问题的方法是改变CMakeLists.txt它以引用新安装的hdf5的目录吗?的CMakeLists.txt样子:

CMAKE_MINIMUM_REQUIRED (VERSION 2.6)
PROJECT (Projectname)


# CMake Modules
SET(CMAKE_MODULE_PATH
  ${PROJECT_BINARY_DIR}/share/cmake/hdf5
  ${CMAKE_SOURCE_DIR}/CMake
  ${CMAKE_MODULE_PATH})

SET(ENV{HDF5_ROOT_DIR_HINT} ${PROJECT_BINARY_DIR})

# Build output 
set(LIBRARY_OUTPUT_PATH "${CMAKE_BINARY_DIR}/lib")
set(EXECUTABLE_OUTPUT_PATH "${CMAKE_BINARY_DIR}/bin")
mark_as_advanced(LIBRARY_OUTPUT_PATH EXECUTABLE_OUTPUT_PATH)


#other stuff I excluded to keep this brief
Run Code Online (Sandbox Code Playgroud)

此外,即使我删除了目录中的所有文件libhome/myname/Desktop/MyProject/build/lib除了 for libhdf5.a,我也会收到一堆 boost 错误。它是一个很长的输出,我认为它是因为make创建新的助推文件lib最初提取home/myname/Desktop/MyProject/build/lib,而不是指的是新安装的升压文件usr/libusr/include

如果有帮助,第 66 行src/Thing/CMakeLists.txt看起来像find_package(HDF5 COMPONENTS C CXX)

如有必要,我还可以发布hdf5-config.cmakeand的内容FindHDF5.cmake

编辑:dpkg -l | greap hdf5

ii  hdf5-helpers                                  1.8.15-patch1+docs-4                       amd64        Hierarchical Data Format 5 (HDF5) - Helper tools
ii  hdf5-tools                                    1.8.15-patch1+docs-4                       amd64        Hierarchical Data Format 5 (HDF5) - Runtime tools
ii  libhdf5-10:amd64                              1.8.15-patch1+docs-4                       amd64        Hierarchical Data Format 5 (HDF5) - runtime files - serial version
ii  libhdf5-cpp-10:amd64                          1.8.15-patch1+docs-4                       amd64        Hierarchical Data Format 5 (HDF5) - C++ libraries
ii  libhdf5-dev                                   1.8.15-patch1+docs-4                       amd64        Hierarchical Data Format 5 (HDF5) - development files - serial version
ii  libhdf5-openmpi-10:amd64                      1.8.15-patch1+docs-4                       amd64        Hierarchical Data Format 5 (HDF5) - runtime files - OpenMPI version
ii  libhdf5-openmpi-dev                           1.8.15-patch1+docs-4                       amd64        Hierarchical Data Format 5 (HDF5) - development files - OpenMPI version
ii  libhdf5-serial-dev                            1.8.15-patch1+docs-4                       all          transitional dummy package
Run Code Online (Sandbox Code Playgroud)

use*_*253 5

关于在 Linux 上链接第三方库的不那么简短的介绍:

一般来说,你应该决定两个方面。

第一个是关于“系统 vs 自定义库”

  1. 您可以将您的应用程序链接到从系统包安装的库(在 Debian 中使用apt-get)。这是在 Linux 上编译程序的首选方式,除非您有一些反对的理由(见下文)。通常这是最简单的方法,因为所有构建工具都配置为在某些“知名”位置查找库组件。
  2. 链接到库的自定义构建。如果您需要某个库的一些自定义构建选项,或者需要存储库中不可用的特定版本的库等,请使用此方法。

第二步是在静态库和动态库之间进行选择。

  1. 通常在 Linux 中,应用程序链接到动态加载的库 ( .so)。这会减少应用程序的大小,可能会减少内存消耗和应用程序加载时间(因为给定应用程序的库已经在内存中),有时还可以简化安全修复等小更新——一个人只需要更新一个库,而不是所有使用它的应用程序脆弱的图书馆

  2. 但也有缺点 :) 如果您计划将与动态库链接的应用程序分发到其他计算机,您需要确保所需版本的库位于给定的目标计算机上。每个库又可以与其他库等链接。最后,您必须分发操作系统的完整副本,例如 Linux 版 Steam 所做的:在内部它承载了 Ubuntu 的很大一部分。因此,有时链接静态库并将所需的所有内容包含在您的应用程序中可能更明智。

回到实际问题。由于您已经安装了带有 libhdf5 开发文件 ( libhdf5-dev) 的系统包,我建议您使用“系统库” (p1.1)。

在这种情况下,您应该从构建树中完全删除库的所有其他副本,并在 CMakeLists.txt 中使用以下代码块:

find_package(HDF5 REQUIRED)
...
include_directories(${HDF5_INCLUDE_DIRS})
...
target_link_libraries(yourapp ${HDF5_LIBRARIES} <other required libs>)
Run Code Online (Sandbox Code Playgroud)

如果你的应用程序是一个C ++应用程序,你可以使用${HDF5_CXX_LIBRARIES}的替代${HDF5_LIBRARIES}

如果您决定链接静态库,则需要HDF5_USE_STATIC_LIBRARIES 调用之前定义一个特殊变量find_package(HDF5...)

 set(HDF5_USE_STATIC_LIBRARIES ON)
 find_package(HDF5 REQUIRED)
 ...
Run Code Online (Sandbox Code Playgroud)

如果您仍然希望使用库的自定义构建,那么您应该“解释”到find_package何处查找库组件。您可以make DESTDIR=/some/path installHDF5 构建树中运行,然后在应用程序构建树中运行 cmake 时将其/some/path用作HDF5_ROOT环境变量的值:

  HDF5_ROOT=/some/path cmake .
Run Code Online (Sandbox Code Playgroud)

在这种情况下,CMake 将尝试在该目录中定位 HDF5 组件。我会libhdf5-dev在此操作之前(以防万一)使用apt-get remove libhdf5-dev.

但我再次相信你应该有充分的理由不使用系统 libhdf5 包。