嗨stackoverflowers :)
如果我构建一个Qt / qmake示例项目(在我的示例中为“模拟时钟”示例)并将其部署到运行iOS 7.1的设备,则一切都会顺利进行:该应用程序在该设备上可以完美执行。Chapeau-来自digia的人们做了艰巨的工作,将ios工具链集成到他们的Qt工作流程中。
但是,如果我将qmake项目转换为CMake项目,事情将变得不那么顺利。我已经附加了Qt-5.3.1版本的模拟时钟示例(请参见下文),其中添加了CMakeLists.txt和运行CMake的脚本以生成iOS的XCode项目。该项目可以编译甚至链接(我必须添加一些其他链接库,请参阅CMake源文件)。好极了。
但这是陷阱:应用程序在运行时崩溃,并显示以下错误消息:
错误:无法加载平台插件“ ios”
作为一个评论这个线程状态一个具有通过项目设置为“力载荷” libqios。这样做并没有太大改善,只是将错误消息更改为:
错误:您正在创建QApplication,然后再调用UIApplicationMain。如果您正在编写本机iOS应用程序,并且只想对部分应用程序使用Qt,则创建QApplication的好地方是在UIApplication委托中的“ applicationDidFinishLaunching”中。
我有两个问题:
这是包含我的Qt-CMake项目的zip文件的链接。我正在使用的Qt版本是iOS的Qt-5.3.1。
编辑:我发现,如果将其从Qt示例文件夹结构中撕裂,则qmake示例将无法正常工作。直接查看Qt示例:path / to / 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魔术是通过以下脚本执行的: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构建的OpenCV。我需要它来解决链接器问题:OpenCV附带的libpng中缺少一些对象。
我希望这可以帮到你。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句