使用arm-linux-androideabi-gcc编译对象的问题

时间:2013-01-13 20:06:42

标签: android-ndk

背景

  • OSX是OS
  • 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

5 个答案:

答案 0 :(得分:8)

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

  1. ndk-buildAndroid.mk BUILD_EXECUTABLE
  2. --sysroot GCC选项
  3. [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
    

答案 1 :(得分: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链接的“替代方案”是什么。

答案 2 :(得分:5)

这个答案为@ deltheil的答案增加了一些细节。我遇到类似的问题,因为我试图编译I2C-tools来调试Android上的I2C总线。不知何故经过一天多的make文件和尝试不同的选项,包括--sysroot&amp; --dynamic-linker选项等,我终于尝试在Android AOSP树中编译它。我使用谷歌Nexus-S AOSP来构建我打算在三星S3手机上运行的二进制文件。我为AOSP /外部文件夹中的源创建了一个名为i2c-tools的文件夹,并复制了Android.mk,Cleanspec.mk&amp;来自另一个可执行文件夹(ping)的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&amp; amp;中复制所有需要的源文件和头文件。包含文件夹,并且必须修改一些#include以删除现在与c-source位于同一位置的头文件的额外路径。

答案 3 :(得分: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

答案 4 :(得分:0)

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