这是一个非常棘手的问题。当我运行makefile时,在输出中看到两个sysroot:

    ubuntu@ubuntu:~/Desktop/LatestAndroidstuff/CmE_source_DAL_1.7_3564/CmCompact$ make
platform/wince/WibuCmHID/rules.mak:31: WibuCmHID only for Windows CE
/home/ubuntu/my-android-toolchain/bin//arm-linux-androideabi-gcc  -I./ -I./external/hidapi/include  -Os  -std=c99 -Wall -Wextra -fno-short-enums -fno-strict-aliasing --sysroot=/home/ubuntu/my-android-toolchain/sysroot --sysroot=/home/ubuntu/android-ndk-r13b/platforms/android-14/arch-arm  -o obj/release/android/armeabi-v7a/static/w_refcount.o -c   base/w_refcount.c
In file included from base/w_refcount.c:29:0:
./base/w_define.h:31:19: fatal error: stdio.h: No such file or directory
 #include <stdio.h>
                   ^
compilation terminated.
rules.mak:54: recipe for target 'obj/release/android/armeabi-v7a/static/w_refcount.o' failed
make: *** [obj/release/android/armeabi-v7a/static/w_refcount.o] Error 1

如果我编辑失败的命令并删除额外的sysroot(第二个),它就会工作。
/home/ubuntu/my-android-toolchain/bin//arm-linux-androideabi-gcc  -I./ -I./external/hidapi/include  -Os  -std=c99 -Wall -Wextra -fno-short-enums -fno-strict-aliasing --sysroot=/home/ubuntu/my-android-toolchain/sysroot --sysroot=/home/ubuntu/android-ndk-r13b/platforms/android-14/arch-arm  -o obj/release/android/armeabi-v7a/static/w_refcount.o -c   base/w_refcount.c

问题是,我已经查看了所有的makefile。makefile非常简单:
WBSMAK_ANDROID_NDK_HOME=/home/ubuntu/android-ndk-r13b
SYSROOT=/home/ubuntu/my-android-toolchain/sysroot
ANDROID_TOOLCHAIN_DIR=/home/ubuntu/my-android-toolchain/bin/
WBSMAK_ANDROID_CC=${ANDROID_TOOLCHAIN_DIR}/arm-linux-androideabi-gcc
WBSMAK_ANDROID_LD=${ANDROID_TOOLCHAIN_DIR}/arm-linux-androideabi-ld
WBSMAK_ANDROID_AR=${ANDROID_TOOLCHAIN_DIR}/arm-linux-androideabi-ar
WBSMAK_ANDROID_RANLIB=${ANDROID_TOOLCHAIN_DIR}/arm-linux-androideabi-ranlib

SHELL       := /bin/bash
AR          := WBSMAK_ANDROID_AR
CC          ?= WBSMAK_ANDROID_CC
LD          ?= WBSMAK_ANDROID_LD
RANLIB      := WBSMAK_ANDROID_RANLIB

为了使文件获取sysroot:
cflags_arch:=--sysroot=${sysroot}
但是在makefile中根本没有提到另一个sysroot,也没有提到出现的路径。另外,我查看并确保它没有拾取环境变量。
ubuntu@ubuntu:~/my-android-toolchain$ printenv | grep SYSROOT
ANDROID_SYSROOT=
LINARO_SYSROOT=/home/ubuntu/linaro-toolchain-4.6/arm-unknown-linux-gnueabi/sysroot
SYSROOT=/home/ubuntu/my-android-toolchain/

它指向的环境sysroot指向了我想要的位置。
如果我将android ndk文件夹及其所有内容移出路径(makefile中没有这个位置),那么就会得到错误。如果我有额外sysroot所在的文件夹,那么库将编译并链接,但它会在android设备上崩溃,android设备是android 21,而不是14。我不知道为什么总是安卓14。我能找个地方找个地方吗?也许当我使用make-standalone-toolchain.sh创建独立工具时,一些硬编码进入了,所以调用/home/ubuntu/my android toolchain/bin/arm linux androideabi gcc总是搜索android-14路径?
非常棘手的问题。我一直在做文件。我不知道为什么gcc一直在使用android 14 sysroot。我可以只提供编译,但链接是拉一个默认的sysroot吗?

最佳答案

好的,这个问题似乎是一个仔细的旁白。MAK文件在一个子文件夹中,它在一个现有字段的字符串中寻找字符串,然后发现它在实际的GCC调用中使用了SysRooStand的SysRooStARCH。但值得赞扬的是,它确实有其他的3月设置需要适当编译和链接的android本机模块。
故事的寓意:总是在文件夹里翻来覆去,看一眼所有的东西。
(当然,我的应用程序仍然会崩溃,但这是另一个问题,以查明……)

关于linux - 多个sysroot会导致从makefile到错误的gcc调用假定Android NDK路径。,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42989349/

10-11 16:02