我正在开发一个在另一台计算机上工作的程序(第一个)并尝试让它在我的新计算机上工作(第三个)。当我转到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
和{{{{}}}中新安装了boost文件后发生了冲突1}}在这台新电脑上。我通过简单地删除usr/include
目录
解决此问题的方法是更改lib
以便它引用新安装的hdf5的目录吗? CMakeLists.txt
看起来像是:
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
home/myname/Desktop/MyProject/build/lib
目录中的所有文件,也会出现一堆提升错误。它是一个非常长的输出,我认为它是因为libhdf5.a
在make
中创建了最初来自lib
的新增强文件,而不是引用home/myname/Desktop/MyProject/build/lib
中新安装的增强文件和usr/lib
如果有帮助,usr/include
的第66行看起来像src/Thing/CMakeLists.txt
如有必要,我还可以发布find_package(HDF5 COMPONENTS C CXX)
和hdf5-config.cmake
的内容
编辑:FindHDF5.cmake
给出
dpkg -l | greap hdf5
答案 0 :(得分:4)
关于在Linux上链接第三方库的简短介绍:
一般来说,你应该决定两个方面。
第一个是关于“系统与自定义库”
apt-get
在Debian中)。这是在Linux上编译程序的首选方法,除非你有一些理由(见下文)。通常这也是最简单的方法,因为所有构建工具都配置为在某些“众所周知的”位置查找库组件。第二步是在静态库和动态库之间进行选择。
通常在Linux应用程序中链接动态加载的库(.so
)。这减少了应用程序的大小,可能减少内存消耗和应用程序加载时间(因为给定应用程序的库已经在内存中),有时简化了安全修复等小更新 - 只需要更新一个库而不是所有使用此易受攻击库的应用程序
但也有缺点:)如果您计划将与动态库链接的应用程序分发到其他计算机,则需要确保所需版本的库在给定目标计算机。每个库可以依次与其他库链接,依此类推。最后,您必须分发操作系统的完整副本,例如,适用于Linux的Steam确实:内部它带有很大一部分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
环境变量的值:< / p>
HDF5_ROOT=/some/path cmake .
在这种情况下,CMake将尝试在该目录中找到HDF5组件。我会在此操作之前删除sytem包libhdf5-dev
(以防万一)使用apt-get remove libhdf5-dev
。
但我再次相信你应该有充分的理由不使用系统libhdf5包。