【问题标题】:Can I put info about multiple executables inside the same bundle in Info.plist?我可以将有关多个可执行文件的信息放在 Info.plist 中的同一个包中吗?
【发布时间】:2014-11-19 18:34:36
【问题描述】:

我有一个使用 Assistant 来显示帮助的 Qt 应用程序。

在 Mac 上,我将他的助手打包到包中。我可以包含其所有库的唯一方法是将 Assistant 可执行文件放在与应用程序可执行文件相同的 MacOS 文件夹中,并正确链接所有库依赖项。

有没有办法在 Info.plist 中放置有关这两个可执行文件的信息?

【问题讨论】:

    标签: macos qt info.plist


    【解决方案1】:

    不,您不能将有关多个可执行文件的信息放在同一个 Info.plist 中。 (好吧,您总是将自定义键放入 Info.plist 并在其中存储您喜欢的任何属性列表数据,但系统不会关注这些键。)

    为什么不将 Google 助理捆绑到它自己的捆绑包中,然后将该捆绑包放入主应用的捆绑包中? Assistant bundle 会有自己的 Info.plist 文件。此外,如果您提出有关任何链接或动态加载问题让您认为必须将其全部放入主包的问题,​​您可能会发现有更好的解决方案。

    【讨论】:

    • 我已经问了很多关于将助手与应用程序捆绑在一起的问题......我将它与应用程序而不是它自己的捆绑包一起放置的原因是,因为我必须包含 Qt应用程序和助手的框架,否则......我没有找到一种方法可以将助手链接到位于应用程序包内的框架(请参阅我的问题stackoverflow.com/questions/26978764/…
    【解决方案2】:

    将 Assistant 可执行文件放在同一个 MacOS 文件夹中

    我建议不要这样做。助手是主应用程序的资源,因此它应该位于资源文件夹中。如果你想从主应用启动助手应用,你可以locate it by name

    您只能在 Info.plist 中定义一个应用程序。如果要添加更多,则键会发生冲突。

    例如,CFBundleIdentifier 是一个唯一的 URI,用于命名捆绑包(例如 com.apple.calculator)。当应用程序被复制到 /Applications 文件夹时,操作系统使用 URI 向操作系统注册应用程序。操作系统希望键是根字典的子项,并且它的值必须是唯一的。如果有多个名为 CFBundleIdentifier 的键,它将不知道哪个是有效的。

    【讨论】:

    • 找到什么?
    【解决方案3】:

    尽管您几乎可以将任何垃圾放入 Mac 应用程序包中,但您不会得到很多好处。

    如果我理解正确,您有一个 Mac 应用程序(通常捆绑)和一个您称为“助手”的辅助应用程序,您希望将其嵌入到同一个应用程序包中。

    您还提到了必须与助手位于同一目录中的库(我猜是 .dylib)。

    现在 - 如果这些库仅由助手端应用程序使用,我建议您将助手捆绑为代码包(Apple 提供了很多关于这些的信息,并且您可以轻松使用 Xcode 中的模板) .然后,您可以使用 Xcode 将其复制到主应用程序包中的正确位置(我会选择“插件”)并使用 NSBundle API 来启动它。

    但是,如果这些 .dylibs 在主应用程序和助手之间共享 - 那么我会说继续,将您的助手、.dylibs 和主应用程序的二进制文件放在同一个“MacOS-X”目录中,然后使用posix API 或 shell 命令来启动助手。当然,它会共享(如果可能的话)主应用程序的每个资源,因为它们位于同一个地方。但是,主应用程序的包只能有一个 CFBundleExecutable 条目,并且应该指向主应用程序的二进制文件。

    【讨论】:

    • 感谢您的回复 - 我的应用程序是在 Qt 中构建的,并使用 Qt 的助手作为帮助工具 - 许多 Qt 框架库 (dylib) 在两者之间共享。我最终达成了妥协……
    猜你喜欢
    • 1970-01-01
    • 2011-09-24
    • 2010-10-26
    • 1970-01-01
    • 1970-01-01
    • 2020-02-02
    • 1970-01-01
    • 1970-01-01
    • 2010-12-13
    相关资源
    最近更新 更多