如何在没有 qmlscene 的情况下创建跨平台的 Ubuntu Touch 应用程序?

如何在没有 qmlscene 的情况下创建跨平台的 Ubuntu Touch 应用程序?

我学习了 C++ 和 Qt,能够创建跨平台应用程序

我有一个非常简单的应用程序可执行文件可以在桌面上运行,但我不知道该怎么做让它在我的 Ubuntu 手机上运行

我发现的所有应用程序示例都是通过执行的qmlscene,但我不喜欢这种方法,因为我想让我的应用程序可在 Qt 支持的所有操作系统上运行

以下是代码:

  • CMakeLists.txt

    project(testapp)
    cmake_minimum_required(VERSION 2.8)
    
    set(CMAKE_INCLUDE_CURRENT_DIR ON)
    set(CMAKE_AUTOMOC ON)
    set(CMAKE_AUTORCC ON)
    
    find_package(Qt5Core  REQUIRED)
    find_package(Qt5Gui   REQUIRED)
    find_package(Qt5Qml   REQUIRED)
    find_package(Qt5Quick REQUIRED)
    
    add_executable(${PROJECT_NAME} main.cpp main.qrc)
    qt5_use_modules(${PROJECT_NAME} Core Gui Qml Quick)
    
    install(TARGETS ${PROJECT_NAME} DESTINATION .)
    
    if(UNIX)
        add_subdirectory(ubuntu-package)
    endif(UNIX)
    
  • ubuntu-package/CMakeLists.txt

    set(UBUNTU_MANIFEST_PATH "manifest.json.in" CACHE INTERNAL "Tells QtCreator location and name of the manifest file")
    
    set(APP_NAME    "${PROJECT_NAME}")
    set(APP_ID      "${PROJECT_NAME}.anonymous")
    set(ICON        "${PROJECT_NAME}.png")
    set(EXEC        "${PROJECT_NAME}")
    
    install(FILES "${PROJECT_NAME}.apparmor" "${ICON}" DESTINATION .)
    
    configure_file(manifest.json.in ${CMAKE_CURRENT_BINARY_DIR}/manifest.json)
    install(FILES ${CMAKE_CURRENT_BINARY_DIR}/manifest.json DESTINATION .)
    
    set(DESKTOP_FILE_NAME "${PROJECT_NAME}.desktop")
    configure_file(${DESKTOP_FILE_NAME}.in ${CMAKE_CURRENT_BINARY_DIR}/${DESKTOP_FILE_NAME})
    install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${DESKTOP_FILE_NAME} DESTINATION .)
    
  • main.cpp

    #include <QGuiApplication>
    #include <QQmlApplicationEngine>
    
    int main(int argc, char *argv[])
    {
        QGuiApplication app(argc, argv);
    
        QQmlApplicationEngine engine;
        engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
    
        return app.exec();
    }
    
  • main.qml

    import QtQuick 2.4
    import QtQuick.Window 2.1
    import Ubuntu.Components 1.3
    
    Window {
        minimumHeight: units.gu(80)
        minimumWidth: minimumHeight
        MainView {
            applicationName: "simpleapp"
            anchors.fill: parent
            Page {
                Button {
                    anchors.centerIn: parent
                    text: "Quit"
                    onClicked: Qt.quit()
                }
            }
        }
        Component.onCompleted: show()
    }
    

完整源代码

当我尝试在 Qt Creator for armhfkit 中构建它时,它会引发错误:

CMakeFiles/testapp.dir/main.cpp.o: undefined reference to symbol '__cxa_end_cleanup@@CXXABI_1.3'
/var/lib/lxd/containers/device-armhf/rootfs/usr/lib/arm-linux-gnueabihf/libstdc++.so.6 error: error adding symbols: DSO missing from command line
collect2: error: ld returned 1 exit status

答案1

Ubuntu 手机上的应用都是开源的,大部分应用不使用qmlscene.Terminal,例如:http://bazaar.launchpad.net/~ubuntu-terminal-dev/ubuntu-terminal-app/trunk/files

您可以克隆该存储库,自行编译并查看其如何完成。

至于undefined reference to symbol '__cxa_end_cleanup@@CXXABI_1.3'- 似乎工具链出了问题。在 CMake 设置中设置CMAKE_VERBOSE_MAKEFILEON查看更多日志。或者看看您是否可以在没有 QtCreator 的情况下从该 LXD 容器中的命令行运行 CMake 构建(然后您可以摆弄单独的编译器和链接器命令)。

相关内容