加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

如何使用cmake函数get_prerequisites和get_filename_component进

发布时间:2020-12-14 00:51:34 所属栏目:百科 来源:网络整理
导读:我们已经设置了一个具有外部共享库依赖项的cmake项目.我们想使用CPack打包项目的二进制文件和依赖项.但是,当我们尝试查找目标的依赖关系时,我们在Windows和Linux系统上获得了不同的结果. 我们看了一下CMake的GetPrerequisites模块(2.8.12).我们已成功使用以
我们已经设置了一个具有外部共享库依赖项的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.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读