- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试为 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
好的,从那里我按照指南,根据需要定义环境变量:
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 应用程序。
但是仍然存在一些问题。
制作
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");
~/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/
SQLite、Content provider 和 Shared Preference 之间的所有已知区别。 但我想知道什么时候需要根据情况使用 SQLite 或 Content Provider 或
警告:我正在使用一个我无法完全控制的后端,所以我正在努力解决 Backbone 中的一些注意事项,这些注意事项可能在其他地方更好地解决......不幸的是,我别无选择,只能在这里处理它们! 所以,我的
我一整天都在挣扎。我的预输入搜索表达式与远程 json 数据完美配合。但是当我尝试使用相同的 json 数据作为预取数据时,建议为空。点击第一个标志后,我收到预定义消息“无法找到任何内容...”,结果
我正在制作一个模拟 NHL 选秀彩票的程序,其中屏幕右侧应该有一个 JTextField,并且在左侧绘制弹跳的选秀球。我创建了一个名为 Ball 的类,它实现了 Runnable,并在我的主 Draf
这个问题已经有答案了: How can I calculate a time span in Java and format the output? (18 个回答) 已关闭 9 年前。 这是我的代码
我有一个 ASP.NET Web API 应用程序在我的本地 IIS 实例上运行。 Web 应用程序配置有 CORS。我调用的 Web API 方法类似于: [POST("/API/{foo}/{ba
我将用户输入的时间和日期作为: DatePicker dp = (DatePicker) findViewById(R.id.datePicker); TimePicker tp = (TimePic
放宽“邻居”的标准是否足够,或者是否有其他标准行动可以采取? 最佳答案 如果所有相邻解决方案都是 Tabu,则听起来您的 Tabu 列表的大小太长或您的释放策略太严格。一个好的 Tabu 列表长度是
我正在阅读来自 cppreference 的代码示例: #include #include #include #include template void print_queue(T& q)
我快疯了,我试图理解工具提示的行为,但没有成功。 1. 第一个问题是当我尝试通过插件(按钮 1)在点击事件中使用它时 -> 如果您转到 Fiddle,您会在“内容”内看到该函数' 每次点击都会调用该属
我在功能组件中有以下代码: const [ folder, setFolder ] = useState([]); const folderData = useContext(FolderContex
我在使用预签名网址和 AFNetworking 3.0 从 S3 获取图像时遇到问题。我可以使用 NSMutableURLRequest 和 NSURLSession 获取图像,但是当我使用 AFHT
我正在使用 Oracle ojdbc 12 和 Java 8 处理 Oracle UCP 管理器的问题。当 UCP 池启动失败时,我希望关闭它创建的连接。 当池初始化期间遇到 ORA-02391:超过
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 9 年前。 Improve
引用这个plunker: https://plnkr.co/edit/GWsbdDWVvBYNMqyxzlLY?p=preview 我在 styles.css 文件和 src/app.ts 文件中指定
为什么我的条形这么细?我尝试将宽度设置为 1,它们变得非常厚。我不知道还能尝试什么。默认厚度为 0.8,这是应该的样子吗? import matplotlib.pyplot as plt import
当我编写时,查询按预期执行: SELECT id, day2.count - day1.count AS diff FROM day1 NATURAL JOIN day2; 但我真正想要的是右连接。当
我有以下时间数据: 0 08/01/16 13:07:46,335437 1 18/02/16 08:40:40,565575 2 14/01/16 22:2
一些背景知识 -我的 NodeJS 服务器在端口 3001 上运行,我的 React 应用程序在端口 3000 上运行。我在 React 应用程序 package.json 中设置了一个代理来代理对端
我面临着一个愚蠢的问题。我试图在我的 Angular 应用程序中延迟加载我的图像,我已经尝试过这个2: 但是他们都设置了 src attr 而不是 data-src,我在这里遗漏了什么吗?保留 d
我是一名优秀的程序员,十分优秀!