Я изучил 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()
}
Когда я пытаюсь создать его в спокойном Создателе для armhf
набор, это бросает ошибки:
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
Приложения, которые находятся по телефону Ubuntu, являются открытым исходным кодом. Большинство из них не использует qmlscene
. Терминал, например: 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_MAKEFILE
на ON
для наблюдения большего количества журналов. Или посмотрите, можно ли выполнить сборку CMake из командной строки в этом контейнер LXD без QtCreator (затем, можно играть с отдельным компилятором и командами компоновщика).