我目前正在尝试在IOS上编译基于QT的项目。 我正在使用cmake创建和配置.xcodeproject和xcode以在设备上运行应用程序。
我成功删除了所有先前的链接器错误,现在我正在处理入口点。
我的main.cpp看起来像那样
int main(int argc, char **argv) {
QApplication app(argc, argv);
return app.exec();
}
这给我带来了以下错误:
错误:您在调用UIApplicationMain之前创建了QApplication。 如果您正在编写本机iOS应用程序,并且只想使用Qt 对于部分应用程序,创建QApplication的好地方是 来自&application; DidFinishLaunching'在您的UIApplication中 委派。
我在这篇文章中发现你应该重命名main,qt将为你完成工作并启动应用程序生命周期
Run-time error for Qt application on ios built via CMake
#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)未定义。 for architecture arm64
在第一篇文章中,他们说我应该有一个 你的/ qt / root / path / mkspecs / macx-ios-clang / rename_main.sh 脚本
我没有,在另一篇文章中答案说:
重命名主要 - > qtmn(在qt sourced中),重建了QT,并从我的main()调用了qt_main_wrapper。
但我不知道我该怎么办"重建并调用qt_main_wrapper"
答案 0 :(得分:3)
修复是添加链接器标志
set(CMAKE_EXE_LINKER_FLAGS ${CMAKE_EXE_LINKER_FLAGS} "-Wl,-e,_qt_main_wrapper")
Qt需要UIApplication才能实现,它是UIKit中定义的应用程序。你可以在里面提交qt_main_wrapper的定义: 的 qtbase / SRC /插件/平台/ IOS / qioseventdispatcher.mm 强>
-e选项为程序指定另一个entryPoint,这将创建此UIApplication。
如果您遵循QApplication的构造函数,它将以ios插件结束,如果未设置“UIApplication”单例,则会启动错误。
最后,如果您的应用程序使用了一些QML
set(CMAKE_EXE_LINKER_FLAGS ${CMAKE_EXE_LINKER_FLAGS} "-u _qt_registerPlatformPlugin")
您需要在main.cpp中加载所有不同的插件
Q_IMPORT_PLUGIN(QtQuick2Plugin)
并在LD Flags中添加.a的路径,如:
set (LINK_LIBRARIES ${LINK_LIBRARIES} "${USE_QT_DIR}/qml/QtQuick/Controls.2/libqtquickcontrols2plugin_debug.a")
对于QtControls2,您还需要添加
set (LINK_LIBRARIES ${LINK_LIBRARIES} "${USE_QT_DIR}/lib/libQt5QuickControls2_debug.a")
set (LINK_LIBRARIES ${LINK_LIBRARIES} "${USE_QT_DIR}/lib/libQt5QuickTemplates2_debug.a")
这有点麻烦,但您可以在项目中运行位于Qt / 5.7 / ios / bin中的qmlimportscanner
:
qmlimportscanner -rootPath path/to/app/qml/directory -importPath path/to/qt/qml/directory
它将为您提供包含项目使用的所有插件的JSON。 这是qmake调用的脚本,如果我有时间我会添加一个脚本来添加不同的插件。
答案 1 :(得分:0)
我刚刚使用Qt 5.15.1进行了测试,现在大多数CMake iOS构建问题似乎已得到解决。剩下的唯一临时项目设置是
set(CMAKE_EXE_LINKER_FLAGS ${CMAKE_EXE_LINKER_FLAGS} "-Wl,-e,_qt_main_wrapper")
在Qt 6中发布https://bugreports.qt.io/browse/QTBUG-87060时,也将修复此问题。