首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CMakeLists无法找到新安装的HDF5?

CMakeLists无法找到新安装的HDF5?
EN

Stack Overflow用户
提问于 2016-01-03 04:39:32
回答 1查看 8.4K关注 0票数 3

我正在做一个在另一台电脑(第一台)上工作的程序,并试图让它在我的新电脑(第三台)上工作。当我转到build并键入ccmake ..时,会得到以下错误:

代码语言:javascript
复制
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看起来像:

代码语言:javascript
复制
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

此外,即使我删除了lib目录中除libhdf5.a之外的所有文件,我也会得到一大堆boost错误。这是一个非常长的输出,我认为这是因为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给出

代码语言:javascript
复制
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
EN

回答 1

Stack Overflow用户

发布于 2016-01-03 19:08:05

关于Linux上第三方库链接的介绍就不那么简单了:

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

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

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

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

  1. 通常,在Linux中,应用程序是通过动态加载库(.so)链接的。这样可以减少应用程序的大小,减少内存消耗和应用程序加载时间(因为给定应用程序的库已经在内存中),有时还简化了诸如安全性修复之类的小更新--只需要更新一个库,而不是所有使用此易受攻击库的应用程序。
  2. 但是也有缺点:)如果计划将与动态库链接的应用程序分发到其他计算机,则需要确保所需版本的库位于给定的目标计算机上。每个图书馆也可以与其他图书馆连接,等等。最后,您必须分发一个操作系统的整个副本,就像所做的那样:在内部它承载了很大一部分Ubuntu。因此,有时可能更明智的做法是链接到静态库,并将所需的所有内容都包含到应用程序中。

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

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

代码语言:javascript
复制
find_package(HDF5 REQUIRED)
...
include_directories(${HDF5_INCLUDE_DIRS})
...
target_link_libraries(yourapp ${HDF5_LIBRARIES} <other required libs>)

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

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

代码语言:javascript
复制
 set(HDF5_USE_STATIC_LIBRARIES ON)
 find_package(HDF5 REQUIRED)
 ...

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

代码语言:javascript
复制
  HDF5_ROOT=/some/path cmake .

在本例中,CMake将尝试在该目录中定位HDF5组件。在此操作之前,我将删除sytem包libhdf5-dev (以防万一)使用apt-get remove libhdf5-dev

但是,我再次认为,您应该有充分的理由不使用系统libhdf5包。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34573387

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档