Como criar um aplicativo Ubuntu Touch de plataforma cruzada sem o qmlscene?

0

Eu aprendi que o C ++ e o Qt podem criar aplicativos multiplataforma .

Eu tenho um aplicativo muito simples, construído como executável , que roda na área de trabalho, mas não consigo descobrir como fazer funcionar no meu telefone Ubuntu .

Todos os exemplos de aplicativos que encontrei são executados via qmlscene , mas não gosto dessa abordagem porque quero que meu aplicativo seja executado em todos os sistemas operacionais suportados pelo Qt .

Aqui está o código:

  • 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()
    }
    

O código-fonte completo

Quando eu tento construí-lo no Qt Creator para armhf kit, ele gera erros:

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
    
por moldcraft 25.09.2016 / 17:54

1 resposta

2

Aplicativos que estão no telefone do Ubuntu são de código aberto. A maioria deles não usa qmlscene . Terminal, por exemplo: link

Você pode clonar esse repositório, compilar a si mesmo e ver como é feito.

Quanto a undefined reference to symbol '__cxa_end_cleanup@@CXXABI_1.3' - parece que o conjunto de ferramentas está fazendo algo errado. Nas configurações do CMake, defina CMAKE_VERBOSE_MAKEFILE para ON para ver mais registros. Ou veja se você pode executar o CMake build a partir da linha de comando no container LXD sem o QtCreator (então você pode mexer com comandos individuais de compilador e linker).

    
por Velkan 25.09.2016 / 18:29