嗨,stackoverflowers:)

如果我构建一个 Qt/qmake 示例项目(在我的例子中是“模拟时钟”示例)并将其部署到运行 iOS 7.1 的设备上,一切都很顺利:该应用程序在设备上完美执行。Chapeau - digia 的工作人员完成了一项艰巨的工作,将 ios 工具链集成到他们的 Qt 工作流程中。

但是,如果我将 qmake 项目转换为 CMake 项目,事情就不再那么顺利了。我附上了 Qt-5.3.1 版本中的模拟时钟示例(见下文),其中添加了 CMakeLists.txt 和运行 CMake 来生成 iOS 的 XCode 项目的脚本。该项目编译甚至链接(我必须添加一些额外的链接库,请参阅 CMake 源文件)。耶。

但这是陷阱:该应用程序在运行时崩溃并显示以下错误消息:

错误:无法加载平台插件“ios”

作为评论 线程指出必须通过项目设置“强制加载”libqios。这样做并没有多大改善情况,只是将错误消息更改为:

错误:您正在调用 UIApplicationMain 之前创建 QApplication。如果您正在编写本机iOS应用程序,并且只想将QT用于应用程序的一部分,那么创建Qapplication的好地方来自您在Uiapplication委托中的“ ApplicationDidDidfinishLaunching”。

我有两个问题:

  • 有谁知道运行时错误的问题是什么?我知道 qmake (以及相应的 ios mkspecs)有相当大的魔力。但如何将其转换为 CMake 呢?
  • 为什么我必须手动将多个库(harfbuzzng、qios、libpng 和几个 iOS 框架)链接到我的目标?find_package(Qt5 ...) 不应该为我做这项工作吗?

这里 是包含我的 Qt-CMake 项目的 zip 文件的链接。我使用的 Qt 版本是 Qt-5.3.1 for iOS。

编辑: :我发现,如果将 qmake 示例从 Qt 示例文件夹结构中取出,则它不会像这样工作。直接看Qt的例子:路径/到/Qt/examples/widgets/widgets/analogclock。

有帮助吗?

解决方案

经过几个小时的研究,我找到了一种为 iOS 的 Qt 应用程序创建 CMake 项目的方法。我通过 Google 并通过检查 qmake 生成的输出获得了关键提示。我找到了真正发挥全部作用的脚本,并将其部分应用到我的 CMake 源代码中。

这是对我有用的食谱。为了完整起见,我还添加了我在发布上述问题时已经知道的步骤:

  • 将CMake引入ios工具链。请参阅我的示例项目的 cmake/toolchain/ios.toolchain.cmake 。它设置多个 CMake 属性并查找必要的工具和框架。(我不记得我从哪里得到这个文件了 - 但如果你用 Google 搜索它,它也会在其他几个项目中使用。)你必须将此安装文件作为参数传递给 CMake(见下文)。

  • 设置可执行文件的多个目标属性,将其转换为 (iOS) 应用程序包。应该很清楚。请注意,有一个模板 Info.plist.in 将由 CMake 完成。

  • 修复1: :在 CMake 中手动将缺少的库和框架链接到应用程序。因为某些原因, find_package(Qt5 ...) 不返回完整的依赖项列表。不过,我很可能在这里遗漏了一些东西。

  • 修复2: :确保强制加载 libqios 以避免出现有关缺少 iOS 插件的错误消息。在 CMake 中:

    set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -force_load ${YOUR_QT_ROOT_PATH}/plugins/platforms/libqios.a" )

  • 修复3: :删除 Info.plist.in 中的情节提要键。这一步我不太明白。该方法的灵感来自于 在 stackoverflow 上发帖。

    <key>UIMainStoryboardFile</key> <string>main</string>

  • 修复4: :现在最重要的是:对于 iOS,您必须使用相应的“C”格式版本重命名 main() 函数。显然,Qt 自带了它自己的 main 入口点并将您编写的入口点重命名为 qtmn(). 。这个 qmake 魔法是由以下脚本执行的:你的/qt/root/path/mkspecs/macx-ios-clang/rename_main.sh。我不详细了解这背后的完整机制。就我而言,我可以重命名 main 的函数签名:

    // Replace... int main(int argc, char *argv[])

    // ... with this line: extern "C" int qtmn(int argc, char *argv[])

这里 又是我在问题中提到的同一项目,这次应用了上面的修复。要构建这个项目,只需调用 build_ios.sh, ,然后打开在 build 文件夹中创建的 xcodeproj 文件。

笔记:工作假设是 XCode 的正确版本(在我的例子中为 5.1.1)可用,并且您拥有有效的签名身份(在 CMakeLists.txt 中更改它!)。此外,在我的示例项目(见下文)中,我假设为 iOS 构建的 OpenCV 可用。我需要它来解决链接器问题:OpenCV 附带的 libpng 中缺少一些对象。

我希望这可以帮到你。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top