首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >通过CMake构建的ios上Qt应用程序的运行时错误

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

Stack Overflow用户
提问于 2014-07-30 09:10:46
回答 1查看 1.6K关注 0票数 4

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

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

但是下面是一个陷阱:应用程序在运行时崩溃,其中包含以下错误信息:

错误:加载平台插件“ios”失败

正如线程中的注释一样,必须通过项目设置“强制加载”libqios。这样做并没有改善情况,它只将错误消息更改为:

错误:在调用QApplication之前创建UIApplicationMain。如果您正在编写本机iOS应用程序,并且只希望对应用程序的某些部分使用Qt,那么创建QApplication的一个好地方就是在您的UIApplication委托中的“applicationDidFinishLaunching”内部。

我有两个问题:

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

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

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-07-31 06:07:31

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

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

  • 将CMake引入ios工具链。参见我的示例项目的cmake/tool链/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中的情节提要键。这一步我不太明白。这种方法的灵感来源于在堆栈溢出上的帖子。 <key>UIMainStoryboardFile</key> <string>main</string>
  • 修复4:现在是顶部的樱桃:对于iOS,您必须用相应的"C“格式化版本重命名main()函数。显然,Qt附带了自己的main入口点,并将您编写的入口点重命名为qtmn()。这个qmake魔术由以下脚本执行: your/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构建的iOS是可用的。我需要它来解决链接器问题: libpng中缺少一些OpenCV附带的对象。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25042916

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档