通过CMake构建的ios上Qt应用程序的运行时错误



如果我构建一个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的好地方是"applicationDidFinishLaunching"。

我有两个问题:

  • 有人知道运行时错误的问题是什么吗?我知道qmake(以及相应的ios mkspec(有一些神奇之处。但如何将其转化为CMake
  • 为什么我必须手动将几个lib(harfbuzzng、qios、libpng和几个iOS框架(链接到我的目标?find_package(Qt5…(不应该为我做这项工作吗

这是一个zip文件的链接,其中包含我的Qt CMake项目。我使用的Qt版本是iOS版的Qt-5.3.1。

编辑:我发现,如果您将qmake示例从Qt examples文件夹结构中删除,它就不会像这样工作。直接看一下Qt示例:path/to/Qt/examples/widgets/widgets/analogclock。

经过几个小时的挖掘,我找到了如何为我的iOS Qt应用程序创建CMake项目的方法。我通过谷歌和检查qmake生成的输出得到了关键提示。我找到了真正具有魔力的脚本,并将其中的一部分应用到我的CMake源中。

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

  • 将CMake引入ios工具链。请参阅我的示例项目的cmake/toolchain/ios.toolchain.cmake。它设置了几个CMake属性,并寻找必要的工具和框架。(我已经记不起我从哪里得到这个文件了,但如果你在谷歌上搜索的话,它也被用于其他几个项目。(你必须将这个设置文件作为参数传递给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,你必须用相应的"重命名main((函数;C";格式化版本。显然,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,然后打开在构建文件夹中创建的xcodeproj文件。

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

相关内容

  • 没有找到相关文章

最新更新