Android中使用Makefile编译程序和库的方法

本文介绍如何使用Android NDK编译动态库和静态库,并提供了两种不同的Makefile示例,一种用于编译动态库libtest.so,另一种用于编译静态库libtest.a。此外,还介绍了如何利用automake工具简化编译过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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\n%d\n", s_string, ret8());  
7.    return 0;  
8.} 

1.


     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需放在其它库的前面,否则程序在运行时会有无法链接的提示,但在链接时没有报错。

本篇文章来源于 Linux公社网站(www.linuxidc.com)  原文链接:http://www.linuxidc.com/Linux/2011-03/33928.htm

 

 2. 将库编译为静态库时

    test的Makefile此时为将

    

1.LDFLAGS += /home/apuser/Downloads/Android-ndk/android-ndk-r4/libtest/libtest.so  


    改为   

1.LDFLAGS += /home/apuser/Downloads/android-ndk/android-ndk-r4/libtest/libtest.a  


    即可

    libtest的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.INCLUDES= -I $(PATH_PREFIX)/include  
5.CCFLAGS = -L $(PATH_PREFIX)/lib \  
6.         -fPIC \  
7.         -Wall  
8.libtest.a: libtest.o  
9.        $(AR) -rcs $@ $^  
10.libtest.o : libtest.c  
11.clean:  
12.        rm *.a 
 

    3. test的Makefile也可通过automake工具生成

    首先执行autoscan

    将生成的configure.scan重命名为configure.ac

    configure.ac内容修改如下    

 

 
1.AC_PREREQ([2.65])  
2.AC_INIT([test], [1.0.0], [-])  
3.AM_INIT_AUTOMAKE  
4.AC_CONFIG_SRCDIR([test.c])  
5.AC_CONFIG_HEADERS([config.h]) 
6.# Checks for programs.  
7.AC_PROG_CC 
8.# Checks for libraries. 
9.# Checks for header files. 
10.#AC_CHECK_HEADERS([string.h]) 
11.# Checks for typedefs, structures, and compiler characteristics. 
12.# Checks for library functions.  
13.AC_OUTPUT([Makefile]) 

本篇文章来源于 Linux公社网站(www.linuxidc.com)  原文链接:http://www.linuxidc.com/Linux/2011-03/33928p2.htm

 

 

Makefile.am内容如下   


 
1.AUTOMAKE_OPTIONS = foreign  
2.bin_PROGRAMS = test  
3.test_SOURCES = test.c 
 

    依次执行

    aclocal

    autoheader

    autoconf

    automake --add-missing

    编写脚本build.sh,内容如下

     

 

 
1.CC=arm-eabi-gcc \  
2.LD=arm-eabi-gcc \  
3.CFLAGS="-I/home/apuser/Downloads/Android-ndk/android-ndk-r4/build/platforms/android-8/arch-arm/usr/include" \  
4.LDFLAGS="-L/home/apuser/Downloads/android-ndk/android-ndk-r4/build/platforms/android-8/arch-arm/usr/lib -nostdlib -lm -lstdc++ -lc -ldl -Bdynamic -Wl,-dynamic-linker,/system/bin/linker /home/apuser/Downloads/android-ndk/android-ndk-r4/build/platforms/android-8/arch-arm/usr/lib/crtbegin_dynamic.o /home/apuser/Downloads/android-ndk/android-ndk-r4/build/platforms/android-8/arch-arm/usr/lib/crtend_android.o" \  
5../configure \  
6.        --build=i386-linux \  
7.         --host=arm-elf-linux \ 
 
    执行脚本build.sh后编译即可。

    另有Funambol的脚本,也可使用,内容如下   

 

 
1.command for C compiller:  
2../configure --host=arm-eabi CC=arm-eabi-gcc CPPFLAGS="-I$ANDROID_ROOT/build/platforms/android-5/arch-arm/usr/include/" CFLAGS="-nostdlib -fno-exceptions -fno-rtti -Wno-multichar" LDFLAGS="-Wl,-rpath-link=$ANDROID_ROOT/build/platforms/android-5/arch-arm/usr/lib/ -L$ANDROID_ROOT/build/platforms/android-5/arch-arm/usr/lib/" LIBS="-lc" 
3.command for C++ compiller:  
4../configure --host=arm-eabi CXX=arm-eabi-g++ CPPFLAGS="-I$ANDROID_ROOT/build/platforms/android-5/arch-arm/usr/include/ -nostdlib -fno-exceptions -fno-rtti -Wno-multichar" LDFLAGS="-Wl,-rpath-link=$ANDROID_ROOT/build/platforms/android-5/arch-arm/usr/lib/ -L$ANDROID_ROOT/build/platforms/android-5/arch-arm/usr/lib/" LIBS="-lc" 

本篇文章来源于 Linux公社网站(www.linuxidc.com)  原文链接:http://www.linuxidc.com/Linux/2011-03/33928p3.htm

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值