这是一个最棘手的问题。当我运行我的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 21,而不是14.我不知道它为什么总是Android 14我可以错过某个地方吗?也许当我使用make-standalone-toolchain.sh创建独立工具时硬编码进入了所以调用/ home / ubuntu / my-android-toolchain / bin / arm-linux-androideabi-gcc总是搜索android-14路径?
非常棘手的问题。我一直在makefile上。我不知道为什么gcc不断拿起那个android 14 sysroot。我可以只提供编译,但链接是否提取默认的sysroot?
答案 0 :(得分:0)
好的问题似乎是在子文件夹中一个仔细的边线.mak文件,该子文件夹在现有字段的字符串中查找字符串并在查找时,在实际的gcc调用中使用ANDROID_ARCH作为--sysroot 。但是对于谁编写它的功劳,它确实具有正确编译和链接android原生模块所需的其他-march设置。
故事的道德:总是浏览文件夹并浏览一切。
(当然我的应用程序仍然崩溃,但另外一件事就是发现......)