我有一个用 C++、Qt 和一点 Objective C 编写的 Win 和 Mac OSX 平台的跨平台应用程序。在支持两个不相关的平台特定项目(VS 2010 和 xCode)一段时间后,我们决定创建一个单一的 CMake脚本。我们生成一个特定于平台的项目并使用它。
经过相当长时间的研究,我设法编译并链接了我的应用程序。但是创建一个合适的包仍然有很多问题(没有任何努力,xCode 只是创建了一个二进制文件)。设置一些变量后,xCode 编译并创建一个没有 plist 文件和应用程序可执行文件的虚拟包。所以我需要将所有必需的框架和资源复制到包中。
我尝试了几种方法来创建捆绑包。第一个是使用SET_SOURCE_FILES_PROPERTIES( ${resourcePath} PROPERTIES MACOSX_PACKAGE_LOCATION ${pathInsideBundle} )
并将它们(框架\资源)添加到 ADD_EXECUTABLE 中,如下所示:ADD_EXECUTABLE( FranchiseTracker MACOSX_BUNDLE ${headers} ${sources} ${form_headers} ${resources_rcc} ${thirdparty_sources} ${BUNDLE_COPY_RESOURCES} )
。它成功了 - 我已经设法将图标和 Sparkle 框架复制到包中,但问题是我无法复制 Qt 框架,因为变量FIND_PACKAGE
为空${QT_LIBRARIES}
,所以我无法获得路径“手动”复制框架。
现在我将使用“fix_bundle”方法,因为它保证我可以在没有我干预的情况下复制所有必需的资源。所以,这是我与 fixup_bundle() 相关的代码:
# Fixup bundle, copy dynamic libraries into app bundle
SET( EXECUTABLE_OUTPUT_PATH ${CMAKE_CURRENT_BINARY_DIR}/out )
SET( APPS "\${CMAKE_CURRENT_BINARY_DIR}/out/${APP_NAME}.app" ) # paths to executables
SET( DIRS "${CMAKE_SOURCE_DIR}/osx/FRP/vendors/libraries/lib" ) # directories to search for prerequisites
INSTALL( CODE "
include(BundleUtilities)
fixup_bundle(\"${APPS}\" \"\" \"${DIRS}\")
")
现在我被一点细化难住了。事情是顽固的 xCode 坚持生成和写入我的包${CMAKE_CURRENT_BINARY_DIR}/out/Debug
,因此 fixup_bundle 根本找不到任何包。
我的具体问题(如标题所示):如何在 CMake 脚本中获得正确的路径(带调试)?我想避免使用 Debug 对路径进行硬编码,因为在存档的情况下这将是错误的。
我更常见的问题是:有没有更简单的方法可以使用 CMake 为 Qt 应用程序创建包?也许我的整个方法都是错误的?
PS我已在此处将完整的脚本发布到 Code Review中。
PPS对于那些认为我的问题过于冗长的人。我发布了完整的脚本并编写了我的尝试(除了我想让它工作)的原因是互联网上几乎没有关于在 CMake 中使用 Mac OSX 框架、包等的信息。我不得不阅读大量的邮件列表,因为我找不到任何结构化的教程或至少一个像样的文档。学习的唯一来源是其他人编写的其他脚本。所以我希望我的脚本和解释对某人有所帮助。