您的位置:首页 > 移动开发 > Android开发

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

2013-06-02 22:32 459 查看
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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: