Не удается настроить с помощью CMake при настройке Marble для Android на Linux - PullRequest
1 голос
/ 03 марта 2020

Я пытаюсь собрать Marble, библиотеку Qt для карт и навигации, для Android. На данный момент я предпочел бы go таким образом, чем использовать QtLocation и QML, потому что мне намного удобнее работать с интерфейсом C ++. Для этого я следую этому руководству: https://community.kde.org/Marble/AndroidCompiling

Мои спецификации следующие:

  • Kali Linux на виртуальной машине VirtualBox (выпуск 2020.1, кодовое имя Kali-Rolling) (да, я знаю, что я немного хреновик ... И правда, я немного новичок в Linux, но инструменты, которые он предоставляет, полезны для проектов, которыми я являюсь в настоящее время работаю над. Более того, для предыдущего проекта я уже установил Qt и необходимые Android инструменты, как описано здесь: https://doc.qt.io/qt-5/android-getting-started.html.

  • Qt 5.14.1 и Qt Creator 4.11.1

  • Android SDK: Android SDK build-tools 30-rc1, LLDB, NDK (рядом), Android SDK Инструменты командной строки (последняя версия), CMake, Android Инструменты платформы SDK (29.0.6), Android Инструменты SDK (устарели) (26.1.1), но заменены Sdk/tools версией SDK Tools r25.2.5 в соответствии с инструкциями по инструкции; установлены платформы Sdk 10 и 20–29.

  • Android Ndk: android -ndk-r21 (последняя загрузка). В папке ndk есть Sdk установка (Sdk/ndk/21.0.6113669/) Я не знаю, являются ли они одинаковыми, или они имеют одинаковую версию. В любом случае это не работает ни с одним из них.

  • JDK: Я установил openjdk 8 (/usr/lib/jvm/java-8-openjdk-amd64), потому что Sdk мог работать только с "Java 1.8", как сказано от QtCreator.

  • CMake: версия 3.16.3

  • Ant: версия 1.10.7

  • Мраморные источники в ~/marble/sources и дополнительные cmake-модули из KDE в этой папке

  • Киригами в ~/kirigami

Хорошо, так что от там я следую руководству, определяю переменные окружения по мере необходимости:

export ANDROID_NDK_ROOT=~/Android/android-ndk-r21
export ANDROID_NDK=$ANDROID_NDK_ROOT
export ANDROID_SDK_ROOT=~/Android/Sdk
export ANT=/usr/bin/ant
export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
export Qt5_android=/opt/Qt/5.14.1/android
export ECM=~/marble/sources/extra-cmake-modules
export ANDROID_PLATFORM=android-29

И вот тогда я не могу настроить с помощью cmake при запуске следующей команды из ~/kirigami/build:

cmake ..  -DCMAKE_TOOLCHAIN_FILE=${ECM}/toolchain/Android.cmake -DCMAKE_PREFIX_PATH=${Qt5_android} -DCMAKE_INSTALL_PREFIX=~/marble/export -DECM_DIR=/usr/local/share/ECM/cmake

Я получаю следующую ошибку:

-- You can export a target by specifying -DQTANDROID_EXPORTED_TARGET=<targetname> and -DANDROID_APK_DIR=<paths>
-- Android: Targeting API '21' with architecture 'arm', ABI 'armeabi-v7a', and processor 'armv7-a'
-- You can export a target by specifying -DQTANDROID_EXPORTED_TARGET=<targetname> and -DANDROID_APK_DIR=<paths>
-- Android: Selected unified Clang toolchain
-- The C compiler identification is Clang 9.0.8
-- The CXX compiler identification is Clang 9.0.8
-- Check for working C compiler: /home/kali/Android/android-ndk-r21/toolchains/llvm/prebuilt/linux-x86_64/bin/clang
-- Check for working C compiler: /home/kali/Android/android-ndk-r21/toolchains/llvm/prebuilt/linux-x86_64/bin/clang -- broken
CMake Error at /usr/share/cmake-3.16/Modules/CMakeTestCCompiler.cmake:60 (message):
  The C compiler

    "/home/kali/Android/android-ndk-r21/toolchains/llvm/prebuilt/linux-x86_64/bin/clang"

  is not able to compile a simple test program.

  It fails with the following output:

    Change Dir: /home/kali/kirigami/build/CMakeFiles/CMakeTmp

    Run Build Command(s):/usr/bin/make cmTC_be61f/fast && /usr/bin/make -f CMakeFiles/cmTC_be61f.dir/build.make CMakeFiles/cmTC_be61f.dir/build
    make[1]: Entering directory '/home/kali/kirigami/build/CMakeFiles/CMakeTmp'
    Building C object CMakeFiles/cmTC_be61f.dir/testCCompiler.c.o
    /home/kali/Android/android-ndk-r21/toolchains/llvm/prebuilt/linux-x86_64/bin/clang --target=armv7-none-linux-androideabi21 --sysroot=/home/kali/Android/android-ndk-r21/sysroot   -march=armv7-a -mthumb -mfpu=vfpv3-d16 -mfloat-abi=softfp -funwind-tables -no-canonical-prefixes -D__ANDROID_API__=21 -fexceptions  -g -fPIE   -o CMakeFiles/cmTC_be61f.dir/testCCompiler.c.o   -c /home/kali/kirigami/build/CMakeFiles/CMakeTmp/testCCompiler.c
    Linking C executable cmTC_be61f
    /usr/bin/cmake -E cmake_link_script CMakeFiles/cmTC_be61f.dir/link.txt --verbose=1
    /home/kali/Android/android-ndk-r21/toolchains/llvm/prebuilt/linux-x86_64/bin/clang --target=armv7-none-linux-androideabi21 --sysroot=/home/kali/Android/android-ndk-r21/platforms/android-21/arch-arm -march=armv7-a -mthumb -mfpu=vfpv3-d16 -mfloat-abi=softfp -funwind-tables -no-canonical-prefixes -D__ANDROID_API__=21 -fexceptions  -g  -Wl,--fix-cortex-a8  -fPIE -pie -Wl,--gc-sections -Wl,-z,nocopyreloc  CMakeFiles/cmTC_be61f.dir/testCCompiler.c.o  -o cmTC_be61f   -latomic -lm 
    /home/kali/Android/android-ndk-r21/toolchains/llvm/prebuilt/linux-x86_64/bin/../lib/gcc/arm-linux-androideabi/4.9.x/../../../../arm-linux-androideabi/bin/ld: error: cannot find -lunwind
    /home/kali/Android/android-ndk-r21/toolchains/llvm/prebuilt/linux-x86_64/bin/../lib/gcc/arm-linux-androideabi/4.9.x/../../../../arm-linux-androideabi/bin/ld: error: cannot find -lunwind
    clang: error: linker command failed with exit code 1 (use -v to see invocation)
    make[1]: *** [CMakeFiles/cmTC_be61f.dir/build.make:87: cmTC_be61f] Error 1
    make[1]: Leaving directory '/home/kali/kirigami/build/CMakeFiles/CMakeTmp'
    make: *** [Makefile:121: cmTC_be61f/fast] Error 2





  CMake will not be able to correctly generate this project.
Call Stack (most recent call first):
  CMakeLists.txt:6 (project)


-- Configuring incomplete, errors occurred!
See also "/home/kali/kirigami/build/CMakeFiles/CMakeOutput.log".
See also "/home/kali/kirigami/build/CMakeFiles/CMakeError.log".

А вот CMakeOutput.log:

The target system is: Android - 21 - armv7-a
The host system is: Linux - 5.4.0-kali3-amd64 - x86_64
Compiling the C compiler identification source file "CMakeCCompilerId.c" succeeded.
Compiler: /home/kali/Android/android-ndk-r21/toolchains/llvm/prebuilt/linux-x86_64/bin/clang 
Build flags: 
Id flags:  

The output was:
0


Compilation of the C compiler identification source "CMakeCCompilerId.c" produced "a.out"

The C compiler identification is Clang, found in "/home/kali/kirigami/build/CMakeFiles/3.16.3/CompilerIdC/a.out"

Compiling the CXX compiler identification source file "CMakeCXXCompilerId.cpp" succeeded.
Compiler: /home/kali/Android/android-ndk-r21/toolchains/llvm/prebuilt/linux-x86_64/bin/clang++ 
Build flags: 
Id flags:  

The output was:
0


Compilation of the CXX compiler identification source "CMakeCXXCompilerId.cpp" produced "a.out"

The CXX compiler identification is Clang, found in "/home/kali/kirigami/build/CMakeFiles/3.16.3/CompilerIdCXX/a.out"

И CMakeError.log:

Determining if the C compiler works failed with the following output:
Change Dir: /home/kali/kirigami/build/CMakeFiles/CMakeTmp

Run Build Command(s):/usr/bin/make cmTC_be61f/fast && /usr/bin/make -f CMakeFiles/cmTC_be61f.dir/build.make CMakeFiles/cmTC_be61f.dir/build
make[1]: Entering directory '/home/kali/kirigami/build/CMakeFiles/CMakeTmp'
Building C object CMakeFiles/cmTC_be61f.dir/testCCompiler.c.o
/home/kali/Android/android-ndk-r21/toolchains/llvm/prebuilt/linux-x86_64/bin/clang --target=armv7-none-linux-androideabi21 --sysroot=/home/kali/Android/android-ndk-r21/sysroot   -march=armv7-a -mthumb -mfpu=vfpv3-d16 -mfloat-abi=softfp -funwind-tables -no-canonical-prefixes -D__ANDROID_API__=21 -fexceptions  -g -fPIE   -o CMakeFiles/cmTC_be61f.dir/testCCompiler.c.o   -c /home/kali/kirigami/build/CMakeFiles/CMakeTmp/testCCompiler.c
Linking C executable cmTC_be61f
/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTC_be61f.dir/link.txt --verbose=1
/home/kali/Android/android-ndk-r21/toolchains/llvm/prebuilt/linux-x86_64/bin/clang --target=armv7-none-linux-androideabi21 --sysroot=/home/kali/Android/android-ndk-r21/platforms/android-21/arch-arm -march=armv7-a -mthumb -mfpu=vfpv3-d16 -mfloat-abi=softfp -funwind-tables -no-canonical-prefixes -D__ANDROID_API__=21 -fexceptions  -g  -Wl,--fix-cortex-a8  -fPIE -pie -Wl,--gc-sections -Wl,-z,nocopyreloc  CMakeFiles/cmTC_be61f.dir/testCCompiler.c.o  -o cmTC_be61f   -latomic -lm 
/home/kali/Android/android-ndk-r21/toolchains/llvm/prebuilt/linux-x86_64/bin/../lib/gcc/arm-linux-androideabi/4.9.x/../../../../arm-linux-androideabi/bin/ld: error: cannot find -lunwind
/home/kali/Android/android-ndk-r21/toolchains/llvm/prebuilt/linux-x86_64/bin/../lib/gcc/arm-linux-androideabi/4.9.x/../../../../arm-linux-androideabi/bin/ld: error: cannot find -lunwind
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make[1]: *** [CMakeFiles/cmTC_be61f.dir/build.make:87: cmTC_be61f] Error 1
make[1]: Leaving directory '/home/kali/kirigami/build/CMakeFiles/CMakeTmp'
make: *** [Makefile:121: cmTC_be61f/fast] Error 2

Так что кажется быть проблемой с каким-то компоновщиком, который не может найти libunwind или что-то подобное. Я попытался установить libunwind с sudo apt install libunwind-dev, но это ничего не решило. Я не достаточно комфортно с cmake, связывая et c. чтобы понять и определить проблему, и я не могу найти какую-либо полезную информацию об этой проблеме в Интернете. Можете ли вы помочь мне?

1 Ответ

0 голосов
/ 05 марта 2020

Хорошо, поэтому я перезапустил все с scracth с установкой fre sh ubuntu 18.04. Я снова все настроил. Несколько точностей:

  • Я получил последний cmake с привязкой, apt установил переднюю версию, которая выдавала некоторые предупреждения или ошибки.

  • Я все еще Я использовал последние версии Qt, Android Sdk и Ndk, и я работал с ndk, который можно загрузить через менеджер Sdk Android Studio.

Сейчас предыдущая ошибка исчезла, но на этом этапе проблема все еще была. Мне пришлось скачать extra-cmake-modules и установить его отдельно, чтобы cmake выполнил свою работу (именно это установило файлы в /usr/local/share/ECM). На данный момент все строится без ошибок. Более того, Qt может развертывать android приложений из нескольких предварительно написанных android -страиваемых примеров, которые он предлагает.

Однако некоторые проблемы остаются.

  • Первая из все, при попытке развернуть самое простое мраморное приложение, последнее сразу вылетает после установки на мое устройство. Я должен также упомянуть, что я прошел весь процесс сборки / установки, нацеленный на android платформу 29, 28 (на котором работает мой телефон) и 27, потому что я прочитал это начиная с android платформы 28, Google пожелает разработчику широко использовать его API-интерфейсы publi c и, как следствие, аварийно завершать работу приложений, пытающихся вызвать функции частных API-интерфейсов. Сообщение об ошибке кажется совместимым с этим объяснением. Вот минимальный код:

qmake

TEMPLATE = app

CONFIG += qt

QT += gui \
      widgets


SOURCES += \
  main.cpp

# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target


INCLUDEPATH += /home/dasha/marble/export/include
DEPENDPATH += /home/dasha/marble/export/include


LIBS += /home/dasha/marble/export/lib/libastro_armeabi-v7a.so \
        /home/dasha/marble/export/lib/libKF5Kirigami2_armeabi-v7a.so \
        /home/dasha/marble/export/lib/libmarbledeclarative_armeabi-v7a.so \
        /home/dasha/marble/export/lib/libmarblewidget-qt5_armeabi-v7a.so

main. cpp

#include <QApplication>
#include <marble/MarbleWidget.h>
#include <marble/MarbleDirs.h>

int main(int argc, char** argv)
{
    QApplication app(argc, argv);

    // Set Paths
    Marble::MarbleDirs::setMarblePluginPath("/home/dasha/marble/export/plugins");
    Marble::MarbleDirs::setMarbleDataPath("home/dasha/marble/export/data");

    // Load Marble using OpenStreetMap in Mercator projection
    Marble::MarbleWidget *mapWidget = new Marble::MarbleWidget;
    mapWidget->setProjection(Marble::Mercator);
    mapWidget->setMapThemeId("earth/openstreetmap/openstreetmap.dgml");

    mapWidget->setWindowTitle("Hello Marble!");
    mapWidget->show();
    return app.exec();
}

Несколько строк в каждой части огромного сообщения об ошибке

I .example.test_: Late-enabling -Xcheck:jni
W System  : ClassLoader referenced unknown path:
D PhoneWindow: windowLightStatusBar : false, disable View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR
D OpenGLRenderer: Skia GL Pipeline
I QtCore  : Start
I Qt      : qt started
W .example.test_: Accessing hidden field Landroid/R$styleable;->ViewDrawableStates:[I (light greylist, reflection)
W .example.test_: Accessing hidden field Landroid/R$styleable;->View_background:I (light greylist, reflection)
W .example.test_: Accessing hidden field Landroid/R$styleable;->View_padding:I (light greylist, reflection)
W .example.test_: Accessing hidden field Landroid/R$styleable;->View_paddingLeft:I (light greylist, reflection)
W .example.test_: Accessing hidden field Landroid/R$styleable;->View_paddingTop:I (light greylist, reflection)
W .example.test_: Accessing hidden field Landroid/R$styleable;->View_paddingRight:I (light greylist, reflection)
W System.err: at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108)
W System.err: at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68)
W System.err: at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1864)
W System.err: at android.os.Handler.dispatchMessage(Handler.java:106)
W System.err: at android.os.Looper.loop(Looper.java:205)
W System.err: at android.app.ActivityThread.main(ActivityThread.java:6991)
W System.err: at java.lang.reflect.Method.invoke(Native Method)
W System.err: at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
W System.err: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:884)
W .example.test_: Accessing hidden field Landroid/R$styleable;->SeekBar:[I (light greylist, reflection)
W .example.test_: Accessing hidden field Landroid/R$styleable;->SeekBar_thumb:I (light greylist, reflection)
W .example.test_: Accessing hidden field Landroid/R$styleable;->SeekBar_thumbOffset:I (light greylist, reflection)
W .example.test_: Accessing hidden field Lcom/android/internal/R$attr;->switchStyle:I (light greylist, reflection)
W .example.test_: Accessing hidden field Landroid/R$styleable;->Switch:[I (light greylist, reflection)
W .example.test_: Accessing hidden field Landroid/R$styleable;->LinearLayout_divider:I (light greylist, reflection)
W .example.test_: Accessing hidden field Landroid/R$styleable;->LinearLayout_showDividers:I (light greylist, reflection)
W .example.test_: Accessing hidden field
Landroid/R$styleable;->LinearLayout_dividerPadding:I (light greylist, reflection)
E AndroidRuntime: FATAL EXCEPTION: qtMainLoopThread
E AndroidRuntime: Process: org.qtproject.example.test_3, PID: 31374
E AndroidRuntime: java.lang.UnsatisfiedLinkError: dlopen failed: library "libastro_armeabi-v7a.so" not found
E AndroidRuntime: at java.lang.Runtime.load0(Runtime.java:928)
E AndroidRuntime: at java.lang.System.load(System.java:1633)
E AndroidRuntime: at org.qtproject.qt5.android.QtNative$4.run(QtNative.java:275)
E AndroidRuntime: at org.qtproject.qt5.android.QtThread$2.run(QtThread.java:87)
E AndroidRuntime: at org.qtproject.qt5.android.QtThread$1.run(QtThread.java:61)
E AndroidRuntime: at java.lang.Thread.run(Thread.java:764)
I Process : Sending signal. PID: 31374 SIG: 9


"org.qtproject.example.test_3" died.

И кажется, что некоторая библиотека не была "экспортирована" и не может быть открыта (libastro) ... Еще одно замечание: добавление этих двух строк в основном. cpp удаляет все сообщения об ошибках, но приложение все равно вылетает.

Marble::MarbleDirs::setMarblePluginPath("/home/dasha/marble/export/plugins");
Marble::MarbleDirs::setMarbleDataPath("home/dasha/marble/export/data");
  • Во-вторых, при попытке построить apk, как указано в конце руководства, я получаю следующая ошибка при запуске ~/marble/sources/src/apps/marble-maps/create-apk.py --target MarbleMaps.apk ../export из ~/marble/sources:
Cannot find ../export/share/deploy-marble-maps.json. Is ../export really a Marble Android installation?

Я не знаю, почему этот файл не был установлен, хотя я могу найти deploy-behaim.json в указанной папке .. .

Я мог бы попытаться установить более старую версию Qt, Android Sdk и Ndk, но, скорее всего, я все равно столкнусь с другими подобными ошибками, и у меня нет времени на go через это. Эта установка слишком хлопотна для меня, я думаю, я буду go с QtLocation et c. для моего приложения, и изучите некоторый QML, поскольку он кажется более простым и более перспективным методом. Однако если вы знаете, что происходит, пожалуйста, не стесняйтесь объяснять, что происходит не так!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...