我们已经设置了一个具有外部共享库依赖项的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.