开发Android下纯C程序时,打开时提示not found
这个问题烦了我一天了..郁闷.本人想试验一下使用ndk里面的toolchains直接编译一个纯C的程序,使其在Android下可运行.于是在Ubuntu下写了一个简单的程序:
sayhi.c
void main(){ write(1,"hi\n",3); }
首先设置export PATH=$NDK/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/arm-linux-androideabi/bin:$NDK/toolchains/arm-linuxandroideabi-4.4.3/prebuilt/linux-x86/libexec/gcc/arm-linux-androideabi/4.4.3
然后执行gcc -v -o sayhi sayhi.c,其中v参数可以输出gcc的执行过程.
其中有3条重要的命令:
ccl -quiet -v -iprefix /home/carmenloklok/android-ndk-r8/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/arm-linux-androideabi/bin/../lib/gcc/arm-linux-androideabi/4.4.3/ sayhi.c -mbionic -quiet -dumpbase sayhi.c -march=armv5te -mfloat-abi-soft -mfpu=vfp -auxbase sayhi -version -o /tmp/ccM7ROuN.s
as -v -march=armv5te -mfloat-abi=soft -mfpu=vfp -meabi=5 -o /tmp/cc4k3VNI.o /tmp/ccM7ROuN.s
ld --sysroot=/home/ahsieh/ndk-release/ndk/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/sysroot --eh-frame-hdr -dynamic-linker /system/bin/linker -X -m armelf_linux_eabi -o sayhi crtbegin_dynamic.o /tmp/cc4k3VNI.o -lgcc -lc -ldl -lgcc crtend_android.o
我们知道编译的过程是:预处理->编译->汇编->连接.所以gcc其实是分别调用了ccl,as,ld来达到这个目的.
从上面可以看到gcc默认给这3个命令加了一些参数.ccl和as的参数我没多理,只是复制了然后自己去调用一次.最后ld的时候,我一开始把 -dynamic-linker /system/bin/linker 这个参数给去掉了.于是编译成功后,放到android手机上运行时发现提示not found.这到底是为什么呢.?
用readelf -l查看sayhi程序,发现它的interpreter是/usr/lib/ld.so.1 查看了资料,发现android下的动态连接器是/system/bin/linker.难怪默认下ld有这个参数了!而我把它去掉了.所以该gcc(其他的gcc可能为其他值,看gcc自己的默认实现,如果不想用它的默认值,则最好分开ccl,as,ld三个步骤自己执行)就缺省动态连接器为/usr/lib/ld.so.1 很明显在android下是没有这个文件的.所以才会提示not found!