【问题标题】:CMakeLists unable to find newly installed HDF5?CMakeLists 找不到新安装的 HDF5?
【发布时间】:2016-01-03 04:39:32
【问题描述】:

我正在开发一个在另一台计算机(第一台)上运行的程序,并试图让它在我的新计算机(第三台)上运行。当我转到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)

即使我随后使用 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

此外,即使我删除了home/myname/Desktop/MyProject/build/liblib 目录中除libhdf5.a 之外的所有文件,我也会收到一堆提升错误。这是一个很长的输出,我认为这是因为makelib 中创建了最初来自home/myname/Desktop/MyProject/build/lib 的新boost 文件,而不是在usr/libusr/include 中引用新安装的boost 文件

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

如有必要,我也可以发布hdf5-config.cmakeFindHDF5.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

【问题讨论】:

  • 您是否安装了libhdf5-devsudo apt-get install libhdf5-dev
  • 我用sudo apt-get install libhdf5-serial-dev安装了它。当我尝试sudo apt-get install libhdf5-dev 时,它会说libhdf5-dev is already the newest version.
  • packages.debian.org/source/wheezy/hdf5 说这是一个过渡包。我会确保所有必要的开发文件实际上都在 FS 中。 dpkg -l | grep hdf5 然后检查每个 -dev 包的内容与 dpkg -L 列出。
  • 顺便说一句,你的最终目标是什么?如果 libhdf5 安装在目标计算机上,您是否打算链接到静态库以避免需要打扰?是的,如果您在树中的某处使用自定义 libhdf5,那么您不应该将它与安装在系统范围内的头文件混合使用。因此,在这种情况下,为了简单起见,您应该至少在一段时间内删除所有 libhdf5*-dev 包,然后根据构建树中的库头构建程序。
  • 对不起,我对 linux 还很陌生,所以我不太了解你所说的。我把dpkg -l | grep hdf5的内容贴在了OP里。我不确定如何通过为每个 -dev 包使用 dpkg -L 找到必要的丢失文件?

标签: linux boost makefile cmake


【解决方案1】:

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

一般你应该决定2个方面。

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

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

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

  1. 通常在 Linux 中,应用程序链接到动态加载的库 (.so)。这减小了应用程序的大小,可能减少了内存消耗和应用程序加载时间(因为给定应用程序的库已经在内存中),有时还简化了安全修复等小型更新 - 只需更新一个库而不是所有使用这个易受攻击的库的应用程序

  2. 但也有缺点 :) 如果您计划将与动态库链接的应用程序分发到其他计算机,您需要确保 所需版本的库位于给定目标计算机。每个库可以依次与其他库链接,依此类推。最后,您必须分发操作系统的完整副本,例如Steam for Linux 确实如此:在内部它承载了 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>)

如果您的应用程序是 C++ 应用程序,您可以使用 ${HDF5_CXX_LIBRARIES} 而不是 ${HDF5_LIBRARIES}

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

 set(HDF5_USE_STATIC_LIBRARIES ON)
 find_package(HDF5 REQUIRED)
 ...

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

  HDF5_ROOT=/some/path cmake .

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

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

【讨论】:

    猜你喜欢
    • 2014-07-21
    • 2015-04-28
    • 2019-01-21
    • 1970-01-01
    • 2021-06-12
    • 2019-05-13
    • 2021-03-22
    • 2016-07-22
    • 2017-06-29
    相关资源
    最近更新 更多