Welcome 微信登录

首页 / 操作系统 / Linux / Android中使用Makefile编译程序和库的方法

    test为可执行程序,libtest为库。在Android中编译并运行它们方法如下,首先要下载NDK。    参考了http://www.linuxidc.com/Linux/2011-02/32531.htm的方法。     1.  将库编译为动态库时:     test中仅有一个文件main.c
  1. #include <stdio.h>  
  2. #include "libtest.h"   
  3. static char s_string[] = "Study hard!";   
  4. int main()   
  5. {   
  6.     printf("%s %d ", s_string, ret8());   
  7.     return 0;   
  8. }  
     Makefile内容如下    
  1. BASE_PATH = /home/apuser/Downloads/android-ndk/android-ndk-r4   
  2. PATH_PREFIX = $(BASE_PATH)/build/platforms/android-8/arch-arm/usr/   
  3. CC = $(BASE_PATH)/build/prebuilt/linux-x86/arm-eabi-4.4.0/bin/arm-eabi-gcc   
  4. LD = $(BASE_PATH)/build/prebuilt/linux-x86/arm-eabi-4.4.0/bin/arm-eabi-ld   
  5. INCLUDES= -I $(PATH_PREFIX)/include     
  6.           -I/home/apuser/Downloads/android-ndk/android-ndk-r4/libtest/   
  7. CFLAGS = -L $(PATH_PREFIX)/lib   
  8. LDFLAGS += -nostdlib -lm -lstdc++ -lc -ldl -Bdynamic -Wl,-dynamic-linker,/system/bin/linker   
  9. LDFLAGS += /home/apuser/Downloads/android-ndk/android-ndk-r4/libtest/libtest.so   
  10. EXTRA_OBJS = $(PATH_PREFIX)/lib/crtbegin_dynamic.o $(PATH_PREFIX)/lib/crtend_android.o   
  11. test: main.c   
  12.         $(CC) $(CFLAGS) $(INCLUDES) -o $@ $^  $(EXTRA_OBJS) $(LDFLAGS)   
  13. clean:   
  14.         rm -rf test *.o   
     libtest中有头文件libtest.h和libtest.c 
  1. #ifndef _RET_8_H_  
  2. #define _RET_8_H_   
  3. int ret8();  
  4. #endif    
 
  1. #include "libtest.h"   
  2. int ret8()   
  3. {   
  4.         return 8;   
  5. }  
      Makefile内容如下    
  1. ASE_PATH = /home/apuser/Downloads/android-ndk/android-ndk-r4   
  2. PATH_PREFIX = $(BASE_PATH)/build/platforms/android-3/arch-arm/usr/   
  3. CC = $(BASE_PATH)/build/prebuilt/linux-x86/arm-eabi-4.4.0/bin/arm-eabi-gcc   
  4. CCFLAGS = -I$(PATH_PREFIX)/include    
  5.           -fpic    
  6.           -mthumb-interwork    
  7.           -ffunction-sections    
  8.           -funwind-tables    
  9.           -fstack-protector    
  10.           -fno-short-enums    
  11.           -D__ARM_ARCH_5__    
  12.           -D__ARM_ARCH_5T__    
  13.           -D__ARM_ARCH_5E__    
  14.           -D__ARM_ARCH_5TE__    
  15.           -Wno-psabi    
  16.           -march=armv5te    
  17.           -mtune=xscale    
  18.           -msoft-float    
  19.           -mthumb    
  20.           -Os    
  21.           -fomit-frame-pointer    
  22.           -fno-strict-aliasing    
  23.           -finline-limit=64    
  24.           -DANDROID    
  25.           -Wa,--noexecstack    
  26.           -O2    
  27.           -DNDEBUG    
  28.           -g     
  29. LDFLAGS = -nostdlib -Wl,-soname,libtest.so -Wl,-shared,-Bsymbolic -Wl,--whole-archive -Wl,--no-whole-archive -Wl,--no-undefined -Wl,-z,noexecstack -Wl,-rpath-link=$(PATH_PREFIX)lib   
  30. EXTRA_OBJS = $(BASE_PATH)/build/prebuilt/linux-x86/arm-eabi-4.4.0/bin/../lib/gcc/arm-eabi/4.4.0/libgcc.a $(PATH_PREFIX)/lib/libc.so $(PATH_PREFIX)/lib/libstdc++.so $(PATH_PREFIX)/lib/libm.so   
  31. libtest.so: libtest.o   
  32.         $(CC) $(LDFLAGS) $^ $(EXTRA_OBJS) -o $@   
  33. libtest.o: libtest.c   
  34.         $(CC) $(CCFLAGS) -c  $^ -o $@    
  35. clean:   
  36.         rm *.so *.o  
     启动模拟器后,在Ubuntu的shell中输入    adb push test /data/    adb push libtest /data/    adb shell chmod 777 /data/test    在模拟器的shell中    cd /data/    export LD_LIBRARY_PATH=./:$LD_LIBRARY_PATH    ./test    注意    EXTRA_OBJS = $(BASE_PATH)/build/prebuilt/linux-x86/arm-eabi-4.4.0/bin/../lib/gcc/arm-eabi/4.4.0/libgcc.a    libgcc.a需放在其它库的前面,否则程序在运行时会有无法链接的提示,但在链接时没有报错。