Linux CMakeLists找不到新安装的HDF5?

Linux CMakeLists找不到新安装的HDF5?,linux,boost,makefile,cmake,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/libhdf

我正在开发一个在另一台计算机上运行的程序(第一台),并试图让它在我的新计算机上运行(第三台)。当我转到
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)
甚至当我使用sudoapt-get安装hdf5时,我也遇到了同样的错误

我不得不删除该
lib
目录,因为它包含过时的boost文件,并导致了大量错误,可能是因为我在这台新计算机上新安装了
usr/lib
usr/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/lib
目录下
libhdf5.a
之外的所有文件,我也会收到一系列boost错误。这是一个很长的输出,我认为这是因为
make
lib
中创建了新的boost文件,这些文件最初来自
home/myname/Desktop/MyProject/build/lib
,而不是在
usr/lib
usr/include>中引用新安装的boost文件

如果有帮助的话,
src/Thing/CMakeLists.txt的第66行类似于
find_包(HDF5组件C CXX)

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

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

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

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

  • 您可以将应用程序链接到从系统包安装的库(在Debian中使用
    apt get
    )。这是在Linux上编译程序的首选方法,除非您有反对的理由(见下文)。通常这也是最简单的方法,因为所有构建工具都配置为在某些“已知”位置查找库组件
  • 针对库的自定义生成的链接。如果您需要库的某些自定义生成选项,或者需要库的特定版本在repostitories中不可用,请使用此方法
  • 第二步是在静态库和动态库之间进行选择

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

  • 但也有缺点:)如果您计划将与动态库链接的应用程序分发到其他计算机,则需要确保所需版本的库位于给定的目标计算机上。每个库可以依次与其他库链接,以此类推。最后,你必须分发一个操作系统的完整副本,就像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>)
    
    如果您仍然希望使用库的自定义构建,那么您应该 “解释”以
    查找软件包
    在何处查找库组件。在应用程序生成树中运行cmake时,您可以在HDF5生成树中运行
    make DESTDIR=/some/path install
    ,然后将该
    /some/path
    用作
    HDF5\u ROOT
    环境变量的值:

      HDF5_ROOT=/some/path cmake .
    
    在这种情况下,CMake将尝试在该目录中定位HDF5组件。在此操作之前(以防万一),我将使用
    apt get remove libhdf5 dev
    删除系统包
    libhdf5 dev


    但我再次相信,您应该有充分的理由不使用system libhdf5软件包。

    您是否安装了
    libhdf5 dev
    sudo-apt-get-install-libhdf5-dev
    我用
    sudo-apt-get-install-libhdf5-serial-dev
    安装了它。当我尝试
    sudo apt get install libhdf5 dev
    时,它说它
    libhdf5 dev已经是最新版本了。
    说它是一个过渡包。我会确保所有必要的开发文件实际上都在FS中
    dpkg-l | grep hdf5
    ,然后检查
    dpkg-l
    中列出的每个
    -dev
    包的内容。顺便问一下,你的最终目标是什么?如果目标计算机上安装了libhdf5,您是否计划针对静态库进行链接以避免麻烦?是的,如果在树中的某个地方使用自定义libhdf5,则不应将其与系统范围内安装的头文件混合使用。因此,在这种情况下,为了简单起见,您应该删除所有libhdf5*-dev包,至少一段时间,然后根据构建树中库的头构建程序。对不起,我对linux比较陌生,所以我不太懂您的意思。我在OP中发布了
    dpkg-l | grep hdf5
    的内容。我不确定如何通过为每个
    -dev
    包使用
    dpkg-l
    找到必要的缺失文件?
      HDF5_ROOT=/some/path cmake .