У меня есть простой код Qt (main. cpp), который я хочу запустить на своем устройстве Android:
#include <QCoreApplication>
#include <QDebug>
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
qDebug()<<"The program starts successfully.";
return a.exec();
}
1 - Сначала я поместил этот код в консольный проект Qt, и я использовал qmake для создания Makefile. После компиляции Qt просто выводит файлы * .apk и * .so из моего проекта, но мне нужен исполняемый файл. Вот мой проект * .pro:
QT -= gui
CONFIG += c++11 console
CONFIG -= app_bundle
TEMPLATE = app
DEFINES += QT_DEPRECATED_WARNINGS
SOURCES += \
main.cpp
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target
, и у меня есть:
Java ver 1.8.0_242: / usr / lib / jvm / java -8-openjdk-amd64
SDK ver 25.2.5: / home / *** / Android / Android / Sdk
NDK ver 20.0.5594570: / home / *** / Android / Android / Sdk / ndk-bundle
2- Чтобы создать исполняемый файл, я использовал Android Clang (C ++, aarch64) компилятор в терминале Ubuntu, выполнив эту команду:
/home/***/Android/Android/Sdk/ndk-bundle/toolchains/llvm/prebuilt/linux-x86_64/bin/clang++ \
-D__ANDROID_API__=21 \
-target aarch64-none-linux-android \
-gcc-toolchain /home/***/Android/Android/Sdk/ndk-bundle/toolchains/llvm/prebuilt/linux-x86_64 \
-fno-limit-debug-info \
-DANDROID_HAS_WSTRING \
--sysroot=/home/***/Android/Android/Sdk/ndk-bundle/platforms/android-21/arch-arm64 \
-isystem /home/***/Android/Android/Sdk/ndk-bundle/sysroot/usr/include/aarch64-linux-android \
-isystem /home/***/Android/Android/Sdk/ndk-bundle/sources/cxx-stl/llvm-libc++/include \
-isystem /home/***/Android/Android/Sdk/ndk-bundle/sources/android/support/include \
-isystem /home/***/Android/Android/Sdk/ndk-bundle/sources/cxx-stl/llvm-libc++abi/include \
-fstack-protector-strong -DANDROID -g -g -std=gnu++11 -Wall -W -D_REENTRANT -fPIC -DQT_DEPRECATED_WARNINGS -DQT_QML_DEBUG -DQT_CORE_LIB \
-I/home/***/Qt5.12.7/5.12.7/android_arm64_v8a/mkspecs/android-clang \
-I/home/***/Qt5.12.7/5.12.7/android_arm64_v8a/include \
-I/home/***/Qt5.12.7/5.12.7/android_arm64_v8a/include/QtCore \
-I/home/***/Android/Android/Sdk/ndk-bundle/sources/cxx-stl/llvm-libc++/include \
-I/home/***/Android/Android/Sdk/ndk-bundle/sysroot/usr/include \
-L/home/***/Android/Android/Sdk/ndk-bundle/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/aarch64-linux-android/21 \
-L/home/***/Android/Android/Sdk/ndk-bundle/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/aarch64-linux-android \
-L/home/***/Qt5.12.7/5.12.7/android_arm64_v8a/lib \
main.cpp \
-lc++ -lc++_shared -lQt5Core \
-o executableMain
Я использовал некоторые флаги и включаю каталоги из Makefile на шаге 1. После компиляции я могу прокрутить исполняемый файл (executetableMain). А также вот результаты file executableMain
и file libc++_shared.so
и file libQt5Core.so
соответственно:
executableMain: ELF 64-bit LSB shared object, ARM aarch64, version 1 (SYSV), dynamically linked, interpreter /system/, with debug_info, not stripped
libc++_shared.so: ELF 64-bit LSB shared object, ARM aarch64, version 1 (SYSV), dynamically linked, BuildID[sha1]=a9c0aad7747976d255d9ea273f6f4c5003901317, stripped
libQt5Core.so: ELF 64-bit LSB shared object, ARM aarch64, version 1 (SYSV), dynamically linked, for GNU/Linux 2.6.28, with debug_info, not stripped
3 - Теперь я хочу запустить файл executetableMain на моем устройстве Android с помощью оболочки adb. Итак, я скопировал libc ++ _ shared.so и libQt5Core.so в / System / lib64 / моего устройства Android и executetableMain в подпапку / data / user / 0. Но после установки разрешения для executetableMain (chmod 777 executableMain
) при запуске ./executableMain
появляется следующая ошибка:
Segmentation fault (core dumped)
Как я могу решить эту проблему?