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

Jac*_*kie 10 android-ndk

背景

  • OSX是OS
  • R8 NDK

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

#include <stdint.h>
int main (void){
   return 0;
}
Run Code Online (Sandbox Code Playgroud)

我用以下命令做...

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
Run Code Online (Sandbox Code Playgroud)

我明白了......

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.
Run Code Online (Sandbox Code Playgroud)

因此,由于缺乏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
Run Code Online (Sandbox Code Playgroud)

我得到......

/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
Run Code Online (Sandbox Code Playgroud)

有人可以帮我解决我做错的事吗?我错过了一个链接或什么?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
Run Code Online (Sandbox Code Playgroud)

del*_*eil 8

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

  1. ndk-buildAndroid.mkBUILD_EXECUTABLE
  2. 或者,--sysrootGCC选项

[1]

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE    := foo
LOCAL_SRC_FILES := foo.c

include $(BUILD_EXECUTABLE)
Run Code Online (Sandbox Code Playgroud)

[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
Run Code Online (Sandbox Code Playgroud)

  • 不要使用〜(代字号). (2认同)

Jac*_*kie 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 
Run Code Online (Sandbox Code Playgroud)

我想知道关于我可以做的gcc链接的"替代"是什么.


小智 5

这个答案为@ deltheil的答案增加了一些细节.我遇到类似的问题,因为我试图编译用于在Android上调试I2C总线的I2C工具.不知怎的,经过一天多的make文件和尝试不同的选项,包括--sysroot和--dynamic-linker选项等,我终于尝试在Android AOSP树中编译它.我使用谷歌Nexus-S AOSP来构建我打算在三星S3手机上运行的二进制文件.我为AOSP /外部文件夹中的源创建了一个名为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
Run Code Online (Sandbox Code Playgroud)

然后我跑了:

source build/envsetup.sh
make i2cdetect
Run Code Online (Sandbox Code Playgroud)

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