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 .