我目前正在尝试在IOS上编译一个基于QT的项目。我正在使用cmake创建和配置.xcodeproject和xcode来在设备上运行应用程序。
我成功地删除了所有以前的链接器错误,现在我正在处理入口点。
我的main.cpp看起来像这样
int main(int argc, char **argv) {
QApplication app(argc, argv);
return app.exec();
}
这导致了以下错误:
错误:您在调用UIApplicationMain之前创建了QApplication。如果您正在编写本机iOS应用程序,并且只想在应用程序的某些部分使用Qt,则从UIApplication委托中的“applicationDidFinishLaunching”中创建QApplication是一个很好的地方。
我在这篇文章中发现,你应该重命名main,qt会为你完成这项工作,并启动应用程序生命周期
Run-time error for Qt application on ios built via CMake
Qt XCode iOS entry point
#if defined(Q_OS_IOS)
extern "C" int qtmn(int argc, char** argv) {
#else
int main(int argc, char **argv) {
#endif
QApplication app(argc, argv);
return app.exec();
}
但现在我正在处理这个错误
ld:入口点(_main)未定义。对于架构arm 64
在第一篇文章中,他们说我应该有一个你的/qt/root/path/mkspecs/macx-ios-clang/rename_main.sh脚本
我没有,在另一个帖子中,答案是:
重命名main -〉qtmn(在qt源代码中),重建QT,并从我的main()调用qt_main_wrapper。
但是我不知道我应该怎么处理“重建并调用qt_main_wrapper”
3条答案
按热度按时间h9a6wy2h1#
修复方法是添加一个链接器标志
Qt需要一个UIApplication来示例化,它是UIKit内部定义的应用程序。你可以将qt_main_wrapper的定义文件放在里面:qtbase/src/plugins/platforms/ios/qioseventdispatcher.mm
-e选项为你的程序指定了另一个入口点,这将创建这个UIApplication。
如果您遵循QApplication的构造函数,它将在ios插件中结束,并且如果未设置“UIApplication”单例,则会启动错误。
最后,如果您的应用程序正在使用某种QML
您需要在main.cpp中加载所有不同的插件
并将路径添加到LD Flags中的.a,类似于:
对于QtControls 2,您还需要添加
这有点麻烦,但你可以在你的项目上运行位于Qt/5.7/ios/bin的
qmlimportscanner
:它会给予你一个JSON与所有的插件使用您的项目。这是脚本调用的qmake,如果我有一些时间,我会添加一个脚本添加不同的插件后。
jaql4c8m2#
我刚刚用Qt5.15.1进行了测试,大多数CMake iOS构建问题现在似乎已经得到了修复。
这也将在https://bugreports.qt.io/browse/QTBUG-87060作为Qt 6的一部分发布时得到修复。
roejwanj3#
使用Qt6.5
如果您使用qmake并得到此错误:
错误:您正在调用UIApplicationMain之前创建QApplication。
将
QMAKE_LFLAGS += -Wl,-e,_qt_main_wrapper
添加到您的.pro文件与qt6.5 qt creator 10一起使用