10

背景

  • OSX 是操作系统
  • R8 NDK

我正在尝试使用 Android GCC 编译器编译以下类...

#include <stdint.h>
int main (void){
   return 0;
}

我使用以下命令执行...

un@un:~/Development/Code/OpenGL$ ~/Development/Android/android-ndk-r8c/toolchains/arm-linux-androideabi-4.6/prebuilt/darwin-x86/bin/arm-linux-androideabi-gcc hello.c -o hello

我得到...

In file included from hello.c:1:0:
/Users/un/Development/Android/android-ndk-r8c/toolchains/arm-linux-androideabi-4.6/prebuilt/darwin-x86/bin/../lib/gcc/arm-linux-androideabi/4.6/include/stdint.h:3:26: fatal error: stdint.h: No such file or directory
compilation terminated.

因此,由于缺乏 gcc 知识(但有一些谷歌能力),我找到了这个并尝试了一下......

un@un:~/Development/Code/OpenGL$ ~/Development/Android/android-ndk-r8c/toolchains/arm-linux-androideabi-4.6/prebuilt/darwin-x86/bin/arm-linux-androideabi-gcc hello.c -o hello -ffreestanding

我得到...

/Users/un/Development/Android/android-ndk-r8c/toolchains/arm-linux-androideabi-4.6/prebuilt/darwin-x86/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld: error: cannot open crtbegin_dynamic.o: No such file or directory
/Users/un/Development/Android/android-ndk-r8c/toolchains/arm-linux-androideabi-4.6/prebuilt/darwin-x86/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld: error: cannot open crtend_android.o: No such file or directory
/Users/un/Development/Android/android-ndk-r8c/toolchains/arm-linux-androideabi-4.6/prebuilt/darwin-x86/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld: error: cannot find -lc
/Users/un/Development/Android/android-ndk-r8c/toolchains/arm-linux-androideabi-4.6/prebuilt/darwin-x86/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld: error: cannot find -ldl
collect2: ld returned 1 exit status

有人可以帮我解决我做错的事情吗?我错过了链接还是什么?Android.mk 不是一个选项。

更新这也不起作用...

arm-linux-androideabi-gcc hello.c --sysroot=~/Development/Android/android-ndk-r8c/platforms/android-9/arch-arm
/Users/jackiegleason/Development/Android/android-ndk-r8c/toolchains/arm-linux-androideabi-4.6/prebuilt/darwin-x86/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld: error: cannot open crtbegin_dynamic.o: No such file or directory
/Users/jackiegleason/Development/Android/android-ndk-r8c/toolchains/arm-linux-androideabi-4.6/prebuilt/darwin-x86/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld: error: cannot open crtend_android.o: No such file or directory
/Users/jackiegleason/Development/Android/android-ndk-r8c/toolchains/arm-linux-androideabi-4.6/prebuilt/darwin-x86/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld: error: cannot find -lc
/Users/jackiegleason/Development/Android/android-ndk-r8c/toolchains/arm-linux-androideabi-4.6/prebuilt/darwin-x86/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld: error: cannot find -ldl
collect2: ld returned 1 exit status
4

5 回答 5

8

您必须告诉 GCC 在哪里可以找到 Android 系统文件和标头。要么使用:

  1. ndk-buildAndroid.mk一个BUILD_EXECUTABLE
  2. 或者,--sysrootGCC 选项

[1]

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE    := foo
LOCAL_SRC_FILES := foo.c

include $(BUILD_EXECUTABLE)

[2]

# Change `android-9` with the level you target
/path/to/android-ndk-r8c/toolchains/arm-linux-androideabi-4.6/prebuilt\
/darwin-x86/bin/arm-linux-androideabi-gcc\
 --sysroot /path/to/android-ndk-r8c/platforms/android-9/arch-arm/\
  foo.c -o foo

# Or generate a ready-to-use standalone toolchain (better)
/path/to/android-ndk-r8c/build/tools/make-standalone-toolchain.sh \
--platform=android-9 \
--install-dir=/tmp/my-android-toolchain

export SYSROOT=/tmp/my-android-toolchain/sysroot

/path/to/arm-linux-androideabi-gcc --sysroot $SYSROOT foo.c -o foo
于 2013-01-13T22:12:10.857 回答
6

所以,由于我不想使用 Android.mk 文件,我继续创建了一个独立的工具链。这是使用以下方法完成的...

/Users/un/Downloads/android-ndk-r8d/build/tools/make-standalone-toolchain.sh --platform=android-9 --install-dir=/tmp/my-toolchain
/tmp/my-toolchain/bin/arm-linux-androideabi-gcc hello.c 

我想知道我可以做的 gcc 链接的“替代方案”是什么。

于 2013-01-13T22:31:41.820 回答
5

这个答案为@deltheil 的答案添加了更多细节。我在尝试编译I2C 工具以在 Android 上调试 I2C 总线时遇到了类似的问题。不知何故,在使用 make 文件和尝试不同的选项(包括 --sysroot 和 --dynamic-linker 选项等)挣扎了一天多之后,我终于尝试在 Android AOSP 树中编译它。我使用 Google Nexus-S AOSP 构建了一个我打算在三星 S3 手机上运行的二进制文件。我为 AOSP/external 文件夹中的源创建了一个名为 i2c-tools 的文件夹,并从另一个可执行文件夹 (ping) 复制了 Android.mk、Cleanspec.mk 和 MODULE_LICENCE 并为 i2c-tools 修改了它,如下所示:

ifneq ($(TARGET_SIMULATOR), true)

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_SRC_FILES := i2cdetect.c i2cbusses.c

LOCAL_C_INCLUDES := $(KERNEL_HEADERS)
LOCAL_MODULE := i2cdetect
LOCAL_MODULE_TAGS := tests
LOCAL_SHARED_LIBRARIES := libc

include $(BUILD_EXECUTABLE)

endif

然后我就跑了:

source build/envsetup.sh
make i2cdetect

从 AOSP 基本文件夹中,瞧,我在 out/target/product/generic/system/bin/ 文件夹中有一个工作可执行文件。请注意,我必须从原始 (i2c-tools)/tools & include 文件夹中复制所有需要的源文件和头文件,并且必须修改一些 #include 以删除现在位于同一位置的头文件的额外路径c源。

于 2013-06-21T17:50:14.977 回答
0

我解决了这个问题,ubuntu 中的默认压缩文件管理器没有提取符号链接,所以我尝试: tar jxf filename.tar.bz2 解压 ndk.tar.bz2 现在它工作正常

于 2014-09-20T11:04:36.840 回答
0

就我而言,我需要一个.o文件并且不需要定义main()。我必须指定-c开关:

~/ax/arm-linux-androideabi-g++ --sysroot=~/an/platforms/android-8/arch-arm/ -c dummy.c

其中~/ax~/an是链接:

ax -> ~/android-ndk-r9d/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86/bin/
an -> ~/android-ndk-r9d/

做了dummy.o

于 2014-04-11T12:52:05.370 回答