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

w8f9ii69  于 2023-04-07  发布在  iOS
关注(0)|答案(3)|浏览(120)

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

h9a6wy2h

h9a6wy2h1#

修复方法是添加一个链接器标志

set(CMAKE_EXE_LINKER_FLAGS ${CMAKE_EXE_LINKER_FLAGS} "-Wl,-e,_qt_main_wrapper")

Qt需要一个UIApplication来示例化,它是UIKit内部定义的应用程序。你可以将qt_main_wrapper的定义文件放在里面:qtbase/src/plugins/platforms/ios/qioseventdispatcher.mm
-e选项为你的程序指定了另一个入口点,这将创建这个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")

对于QtControls 2,您还需要添加

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,如果我有一些时间,我会添加一个脚本添加不同的插件后。

jaql4c8m

jaql4c8m2#

我刚刚用Qt5.15.1进行了测试,大多数CMake iOS构建问题现在似乎已经得到了修复。

set(CMAKE_EXE_LINKER_FLAGS ${CMAKE_EXE_LINKER_FLAGS} "-Wl,-e,_qt_main_wrapper")

这也将在https://bugreports.qt.io/browse/QTBUG-87060作为Qt 6的一部分发布时得到修复。

roejwanj

roejwanj3#

set(CMAKE_EXE_LINKER_FLAGS ${CMAKE_EXE_LINKER_FLAGS} "-Wl,-e,_qt_main_wrapper")

使用Qt6.5
如果您使用qmake并得到此错误:
错误:您正在调用UIApplicationMain之前创建QApplication。
QMAKE_LFLAGS += -Wl,-e,_qt_main_wrapper添加到您的.pro文件与qt6.5 qt creator 10一起使用

相关问题