如何使用cmake函数get_prerequisites和get_filename_component进行目标依赖项安装?

时间:2014-06-23 13:19:52

标签: cmake

我们已经设置了一个具有外部共享库依赖项的cmake项目。我们想使用CPack打包项目的二进制文件和依赖项。但是,当我们尝试查找目标的依赖关系时,我们在Windows和Linux系统上获得了不同的结果。

我们看了一下CMake的GetPrerequisites模块(2.8.12)。我们已成功使用以下CMake代码在linux上获取CMake目标(BINARY)依赖(_libFile)的完整路径,但是我们不知道获得Windows依赖的完整路径。在Windows上,变量dependency_realpath包含$ {CMAKE_SOURCE_DIR} / DEPENDENCY_FILE,这不是依赖项的正确路径。

string(TOUPPER "${CMAKE_BUILD_TYPE}" CONFIG)
GET_TARGET_PROPERTY(MY_BINARY_LOCATION ${BINARY} LOCATION_${CONFIG} )
GET_PREREQUISITES(${MY_BINARY_LOCATION} DEPENDENCIES 0 0 "" "")

foreach( DEPENDENCY_FILE ${DEPENDENCIES})
    get_filename_component( dependency_realpath ${DEPENDENCY_FILE} REALPATH)

所以问题是:为什么我们在Windows和Linux上获得不同的依赖位置结果?

1 个答案:

答案 0 :(得分:9)

get_prerequisites返回的引用不是绝对的完整路径引用,并且它们也无法通过简单的get_filename_component调用解析为绝对引用。 (例如,在Mac上,它们可能包含@executable_path。)

但是,GetPrerequisites.cmake模块中还有另一个名为gp_resolve_item的函数可以帮助你。

试试这个:

get_prerequisites(${MY_BINARY_LOCATION} DEPENDENCIES 0 0 "" "")

foreach(DEPENDENCY_FILE ${DEPENDENCIES})
  gp_resolve_item("${MY_BINARY_LOCATION}" "${DEPENDENCY_FILE}" "" "" resolved_file)
  message("resolved_file='${resolved_file}'")
endforeach()

这应该将DLL名称转换为DLL的完整路径位置,假设它们在您的PATH中。如果他们在其他目录中,您可能需要提供这些目录作为" dirs" get_prerequisites和gp_resolve_item的参数。

GetPrerequisites.cmake模块的文档位于:http://www.cmake.org/cmake/help/v3.0/module/GetPrerequisites.html

此外,可能深入了解BundleUtilities.cmake模块以了解它如何使用GetPrerequisites。