我们已经建立了一个具有外部共享库依赖项的 cmake 项目。我们想要使用 CPack 打包项目的二进制文件和依赖项。然而,当我们尝试查找目标的依赖关系时,我们在 Windows 和 Linux 系统上得到了不同的结果。
我们查看了 CMake 的 GetPrecessions 模块 (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_precessions 返回的引用不是绝对完整路径引用,并且它们也无法通过简单的 get_filename_component 调用解析为绝对引用。 (例如,在 Mac 上,它们可能包含 @executable_path。)
不过,GetPrecessions.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_preventions 和 gp_resolve_item。
GetPrecessions.cmake 模块的文档位于此处:http://www.cmake.org/cmake/help/v3.0/module/GetPrecessions.html
另外,还可以深入研究 BundleUtilities.cmake 模块以了解它如何使用 GetPrecessions。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)