2017-08-04 107 views
2

我目前正在尝试编译基于IOS的基于QT的项目。 我正在使用cmake创建和配置.xcodeproject和xcode以在设备上运行应用程序。QT IOS链接器错误入口点(_main)undefined

我成功地删除了所有以前的链接器错误,现在我正在处理入口点。

我的main.cpp看起来像

这让我以下错误:

Error: You are creating QApplication before calling UIApplicationMain. If you are writing a native iOS application, and only want to use Qt for parts of the application, a good place to create QApplication is from within 'applicationDidFinishLaunching' inside your UIApplication delegate.

我对这个职位发现,您应该重命名主要和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: entry point (_main) undefined. for architecture arm64

在第一篇文章,他们说我应该有一个 你的/ QT /根/路径/ mkspecs/MACX-IOS -clang/rename_main.sh脚本

我得到了没有,在其他职位的答案说给:

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

,但我不知道要高度重视我做的“重建,并呼吁qt_main_wrapper”

+1

我从来没有听说过替换你的main()让iOS工作。我有一个在iTunes Store上发布的应用程序,在没有任何特殊处理的情况下工作得很好(即,对于iOS,android和win32,main()不需要#ifdefs)。我主要看起来像这样:int main(...){return my_singleton :: run(args)}; 我的my_singleton :: run()是静态函数,它看起来像这样: int my_singleton :: run(){singleton_ = new myQApplication(args)} myQApplication是QApplication的直接后代。 –

+0

@ markus-nm谢谢,我在这里更新我的问题https://forum.qt.io/topic/82102/can-t-create-qapplication-for-ios-using-cmake-build,它看起来像Qt不是将我的QApplication封装在ObjectiveC等效的 –

回答

2

定盘添加链接标志

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标志是这样的:

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

+0

中!直到现在我还没有找到入口点重命名技巧 – yano