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
参考了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
相关文章推荐
- Android中使用Makefile编译程序和库的方法
- Android中使用Makefile编译程序和库的方法
- linux下使用Makefile编译程序入门介绍
- 命令行编译android程序,欢迎探讨命令行如何使用proguard混淆优化代码
- Android系统安全之旅 第1章 编译Android程序的方法
- Android程序反编译、重新编译和签名的方法
- [置顶] 用android-ndk-r8e交叉编译cocos2d-x-2.1.4Android工程方法(而不再使用Cgywin,注意ndk和cocos2d-x版本)
- 编译 cocos2d-x-3.13.1 程序:Android Studio (代码配置方法)
- android 卸载程序、清除数据、停止服务使用方法
- android语音识别方法一:使用intent调用语音识别程序
- Android程序反编译的方法(转)
- Makefile中使用隐含规则来编译程序
- 关于在android程序执行过程中使用Intent启动另一个活动后,同个方法未执行的代码是否会继续执行。
- Android JNI 编译正确 但是提示程序有错误无法运行 而且还看不到任何错误提示 的解决方法
- VC6.0命令行编译及使用makefile编译的方法
- Android程序分析工具Traceview的使用方法
- 谈使用Eclipse与DDMS调试Android程序的方法
- Unity-Android通信:AndroidJava 使用Unity c#编写Android程序调用任何方法
- 谈使用Eclipse与DDMS调试Android程序的方法
- iPhone开发进阶(4) --- 使用Makefile自动编译iPhone程序