gpt4 book ai didi

android - 在 Linux 上为 Android 设置 Marble 时无法使用 CMake 配置

转载 作者:行者123 更新时间:2023-12-01 14:53:27 25 4
gpt4 key购买 nike

我正在尝试为 Android 构建 Marble,这是一个用于 map 和导航的 Qt 库。目前,我宁愿采用这种方式,也不愿使用 QtLocation 和 QML,因为我对 C++ 接口(interface)更熟悉。为此,我遵循本指南:https://community.kde.org/Marble/AndroidCompiling

我的规范如下:

  • VirtualBox VM 上的 Kali Linux(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 构建工具 30-rc1、LLDB、NDK(并排)、Android SDK 命令行工具(最新)、CMake、Android SDK 平台工具 (29.0.6)、Android SDK Tools (Obsolete) (26.1.1) 但按照指南的指示用 SDK Tools 版本 r25.2.5 替换了 Sdk/tools;安装了 SDK 平台 10 和 20 到 29。

  • Android Ndk:android-ndk-r21(最新下载)。 Sdk安装里面有个ndk文件夹(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 中的 Marble 源和此文件夹中来自 KDE 的 extra-cmake-modules

  • ~/kirigami

  • 中的 Papercut

好的,从那里我按照指南,根据需要定义环境变量:

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

当我从 ~/kirigami/build 运行以下命令时,我无法使用 cmake 配置:

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 或类似的东西。我尝试安装运行 sudo apt install libunwind-dev 的 libunwind 作为第一个猜测,但这并没有解决任何问题。我不太习惯使用 cmake、链接等来理解和查明问题,而且我无法在网上找到有关此问题的任何有用信息。你能帮帮我吗?

最佳答案

好的,所以我使用全新的 ubuntu 18.04 安装从 scracth 重新启动了所有内容。我已经重新设置了一切。一些精度:

  • 我用 snap 安装了最新的 cmake,apt 安装了一个较早的版本,它给出了一些警告或错误。

  • 我仍然使用最新的 Qt、Android Sdk 和 Ndk 版本,并且我使用可以通过 Android Studio 的 Sdk 管理器下载的并行 ndk。

现在之前的错误没有了,但是到这一步还是有问题。我必须下载 extra-cmake-modules 并单独安装它,以便 cmake 完成它的工作(这是在 /usr/local/share/ECM 中安装文件的原因)。在这一点上,一切都在无误地构建。更重要的是,Qt 能够从它提供的几个预写的 android-buildable 示例中部署 android 应用程序。

但是仍然存在一些问题。

  • 首先,当尝试部署最简单的大理石应用程序时,后者在我的设备上安装后立即崩溃。我还应该提到,我已经完成了针对 android 平台 29、28(我的手机正在运行的平台)和 27 的整个构建/安装过程,因为我已经读到从 android 平台 28 开始,谷歌希望开发人员广泛使用它公共(public) API 并因此导致尝试调用私有(private) API 函数的应用程序崩溃。错误消息似乎与此解释相符。这是最少的代码:

制作

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

主要.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)...另一条评论:在 main.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,但无论如何我很可能会遇到其他类似的错误,而且我没有时间去解决这些问题。这个安装对我来说太麻烦了,我想我会为我的应用程序使用 QtLocation 等,并学习一些 QML,因为它似乎是一种更简单且更适合 future 的方法.但是,如果您知道发生了什么,请随时解释出了什么问题!

关于android - 在 Linux 上为 Android 设置 Marble 时无法使用 CMake 配置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60504110/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com