我正在做一个在另一台电脑(第一台)上工作的程序,并试图让它在我的新电脑(第三台)上工作。当我转到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/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此外,即使我删除了lib目录中除libhdf5.a之外的所有文件,我也会得到一大堆boost错误。这是一个非常长的输出,我认为这是因为make在lib中创建了来自home/myname/Desktop/MyProject/build/lib的新的boost文件,而不是引用usr/lib和usr/include中新安装的boost文件。
如果有帮助,src/Thing/CMakeLists.txt的第66行看起来像find_package(HDF5 COMPONENTS 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发布于 2016-01-03 19:08:05
关于Linux上第三方库链接的介绍就不那么简单了:
一般来说,你应该决定两个方面。
第一个是关于“系统与自定义库”。
apt-get)。这是在Linux上编译程序的首选方法,除非您有一些反对的理由(见下文)。而且通常这是最简单的方法,因为所有的构建工具都被配置成在某些“知名”的地方找到库组件。第二步是在静态库和动态库之间进行选择。
.so)链接的。这样可以减少应用程序的大小,减少内存消耗和应用程序加载时间(因为给定应用程序的库已经在内存中),有时还简化了诸如安全性修复之类的小更新--只需要更新一个库,而不是所有使用此易受攻击库的应用程序。回到实际问题上。既然您已经安装了带有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}。
如果您决定链接到静态库,则需要在调用find_package(HDF5...)之前定义一个特殊变量HDF5_USE_STATIC_LIBRARIES。
set(HDF5_USE_STATIC_LIBRARIES ON)
find_package(HDF5 REQUIRED)
...如果您仍然希望使用库的自定义构建,那么应该向find_package“解释”在哪里查找库组件。您可以在make DESTDIR=/some/path install构建树中运行HDF5,然后在应用程序生成树中运行cmake时使用该/some/path作为HDF5_ROOT环境变量的值:
HDF5_ROOT=/some/path cmake .在本例中,CMake将尝试在该目录中定位HDF5组件。在此操作之前,我将删除sytem包libhdf5-dev (以防万一)使用apt-get remove libhdf5-dev。
但是,我再次认为,您应该有充分的理由不使用系统libhdf5包。
https://stackoverflow.com/questions/34573387
复制相似问题