gpt4 book ai didi

macos - 如何在 CMake 脚本中获取应用程序包的路径以将其提供给 fixup_bundle()?

转载 作者:行者123 更新时间:2023-12-01 04:01:06 25 4
gpt4 key购买 nike

我有一个用 C++、Qt 和一点点 Objective C 编写的 Win 和 Mac OSX 平台的跨平台应用程序。在支持两个不相关的平台特定项目(VS 2010 和 xCode)一段时间后,我们决定创建一个 CMake脚本。我们生成一个特定于平台的项目并使用它。

经过相当长时间的钻研,我设法编译并链接了我的应用程序。但是创建一个合适的包仍然有很多问题(没有任何努力,xCode 只是创建了一个二进制文件)。设置几个变量后,xCode 会编译并创建一个没有 plist 文件和应用程序可执行文件的虚拟包。所以我需要将所有必需的框架和资源复制到包中。

我尝试了几种方法来创建 bundle 。第一个是使用 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)?我想避免使用 Debug 对路径进行硬编码,因为在存档的情况下这将是错误的。

我比较常见的问题 :有没有更简单的方法来使用 CMake 为 Qt 应用程序创建包?也许我的整个方法都是错误的?

附注我已将完整脚本发布到 Code Review here .

P.P.S. 对于那些认为我的问题过于冗长的人。我发布完整脚本并编写我的尝试(除非我想让它工作)的原因是互联网上关于在 CMake 中使用 Mac OSX 框架、 bundle 等的信息很少。我不得不阅读很多邮件列表,因为我找不到任何结构化的教程或至少一个像样的文档。学习的唯一来源是其他人编写的其他脚本。所以我希望我的脚本和解释能对某人有所帮助。

最佳答案

我只使用了 macdeployqt Mac OSX 平台上的实用程序。我使用 xCode 来构建我的应用程序,所以我已经解决了 xCode 宏的路径问题 ${CONFIGURATION}像那样:

....
elseif( APPLE )
ADD_EXECUTABLE( FranchiseTracker MACOSX_BUNDLE ${headers} ${sources} ${form_headers} ${resources_rcc} ${thirdparty_sources} ${BUNDLE_COPY_RESOURCES} )
SET_TARGET_PROPERTIES( FranchiseTracker PROPERTIES OUTPUT_NAME ${APP_NAME} )
SET_TARGET_PROPERTIES( FranchiseTracker PROPERTIES MACOSX_BUNDLE_INFO_PLIST "${CMAKE_SOURCE_DIR}/osx/FRP/info.plist") #or else you'll get an auto generated plist

# Fixup bundle, copy dynamic libraries into app bundle
ADD_CUSTOM_COMMAND( TARGET FranchiseTracker COMMAND macdeployqt ARGS ${CMAKE_CURRENT_BINARY_DIR}/\${CONFIGURATION}/${APP_NAME}.app ) # add -dmg for an image
endif( WIN32 )

注意转义 $ 字符以防止 ${CONFIGURATION}从被扩展为 CMake 变量。

附言我发布到 CodeReview 的代码有点过时了,所以如果有人遇到同样的问题(在 OSX 上创建一个包)并想查看完整的工作变体,请告诉我,我会将其发布在某个地方(也许更新我在 CodeReview 上的帖子)。

关于macos - 如何在 CMake 脚本中获取应用程序包的路径以将其提供给 fixup_bundle()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13420117/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com