Ошибка «Ошибка сегментации (дамп памяти)» после запуска исполняемого файла на устройстве Android (с использованием компилятора Android Clang (C ++, aarch64)) - PullRequest
0 голосов
/ 30 марта 2020

У меня есть простой код 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)

Как я могу решить эту проблему?

...