QT IOS链接器错误入口点(_main)未定义

时间:2017-08-04 13:23:47

标签: ios xcode qt

我目前正在尝试在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

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)未定义。 for architecture arm64

在第一篇文章中,他们说我应该有一个 你的/ qt / root / path / mkspecs / macx-ios-clang / rename_main.sh 脚本

我没有,在另一篇文章中答案说:

重命名主要 - > qtmn(在qt sourced中),重建了QT,并从我的main()调用了qt_main_wrapper。

但我不知道我该怎么办"重建并调用qt_main_wrapper"

2 个答案:

答案 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时,也将修复此问题。