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

我们已经设置了一个具有外部共享库依赖项的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上获得不同的依赖位置结果?

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中.如果它们在某些其他目录中,您可能需要将这些作为get_prequisite和gp_resolve_item的“dirs”参数提供.

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

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

相关文章

迭代器模式(Iterator)迭代器模式(Iterator)[Cursor]意图...
高性能IO模型浅析服务器端编程经常需要构造高性能的IO模型,...
策略模式(Strategy)策略模式(Strategy)[Policy]意图:定...
访问者模式(Visitor)访问者模式(Visitor)意图:表示一个...
命令模式(Command)命令模式(Command)[Action/Transactio...
生成器模式(Builder)生成器模式(Builder)意图:将一个对...