Makefile和Android.mk的基情
来源:互联网 发布:mac装系统开机按哪个键 编辑:程序博客网 时间:2024/06/08 16:04
Makefile
Makefile介绍
make 是一个命令工具,它解释 Makefile 中的指令(应该说是规则) 。在 Makefile
文件中描述了整个工程所有文件的编译顺序、编译规则。Makefile 有自己的书写格式、
关键字、函数。像 C 语言有自己的格式、关键字和函数一样。而且在 Makefile 中可以
使用系统 shell 所提供的任何命令来完成想要的工作。Makefile(在其它的系统上可能
是另外的文件名)在绝大多数的 IDE 开发环境中都在使用,已经成为一种工程的编译
方法。
Makefile三要素:目标,依赖,命令
- 目标:目标分为最终目标(第一行就是最终目标)
- 依赖: 目标符号”:”后的都是依赖
命令:gcc为命令,他是GNU编译器,用于c/c++等编译
GCC最基本的用法是∶gcc [options] [filenames] 其中options就是编译器所需要的参数,filenames给出相关的文件名称。
-c,只编译,不链接成为可执行文件,编译器只是由输入的.c等源代码文件生成.o为后缀的目标文件,通常用于编译不包含主程序的子程序文件。
- -o output_filename,确定输出文件的名称为output_filename,同时这个名称不能和源文件同名。如果不给出这个选项,gcc就给出预设的可执行文件a.out。
#step 1#myapp:main.o func.o # gcc main.o func.o -o myapp#目标:main.o .o为后缀的文件,是编译后的目标文件;#依赖:main.c .c为后缀的文件,C语言源代码文件;#命令:gcc -c main.c #main.o:main.c# gcc -c main.c#func.o:func.c# gcc -c plus.c
Makefile变量和简单运算(代码复制自别处)
#变量#OBJECTS=main.o func.o add.o multi.o#step 3#所有.c源文件SOURCES=$(wildcard *.c)#把.c后缀,替换成.o后缀OBJECTS=$(patsubst %.c,%.o,$(SOURCES))myapp:$(OBJECTS)#自动化变量 $^表示所有依赖,$@表示目标 gcc $^ -o $@#通配符 #main.o:main.c%.o:%.c#gcc -c main.c -o main.o gcc -c $^ -o $@#clean清除所有的.o中间文件#伪目标.PHONY:cleanclean: rm -f *.o rm -f myapp#递归展开式#可以引用还没有定义的变量,展开是引用时展开str2=$(str1)str1=hello#直接展开式#必须引用定义好了的变量,定义之后就会展开str3 := androidstr4 := $(str3)str5 := $(str1) world#变量的值追加str5 += hello#自定义函数myfun=$2 $1#变量等于函数的执行结构myfun_ret=$(call myfun,20,10)test: @echo $(SOURCES) @echo $(OBJECTS) @echo $(str2) @echo $(str4) @echo $(str5) @echo $(myfun_ret) @echo $(call myfun,30,40)
Android.mk
学习小例子
LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS)#模块名称 LOCAL_MODULE := hello-jni#编译时所需源文件 LOCAL_SRC_FILES := hello-jni.c#需要的头文件 LOCAL_C_INCLUDES += $(LOCAL_PATH)/include/ffmpeg include $(BUILD_SHARED_LIBRARY)
LOCAL_PATH := $(call my-dir)
可文件必须首先LOCAL_PATH变量的定义。
它是用来定位在开发树的源文件。在这个例子中,宏函数“my-dir”,提供的构建系统,用于返回
当前目录的路径(即包含Android的目录。可文件本身)。include $(CLEAR_VARS)
CLEAR_VARS变量提供的构建系统,指出了一个特殊的GNU Makefile,会清楚很多LOCAL_XXX变量
(例如LOCAL_MODULE,LOCAL_SRC_FILES、LOCAL_STATIC_LIBRARIES等…),除了LOCAL_PATH。这是必要的,因为所有的构建
控制文件解析一个GNU使执行上下文,所有变量都是全局的。
- LOCAL_MODULE := hello-jni
LOCAL_MODULE变量必须定义来确定每个模块你在Android.mk描述。名称必须独特* *和不包含
任何空间。注意,构建系统将自动添加适当的前缀和后缀生成相应的文件。换句话说,
共享库模块命名“foo”将生成“libfoo.so”。
- LOCAL_SRC_FILES := hello-jni.c
LOCAL_SRC_FILES变量必须包含将要打包如模块的C/C++ 源码。不必列出头文件,build System 会自动帮我们找出依赖文件。
缺省的C++源码的扩展名为.cpp. 也可以修改,通过LOCAL_CPP_EXTENSION。
- include $(BUILD_SHARED_LIBRARY)
BUILD_SHARED_LIBRARY:是Build System提供的一个变量,指向一个GNU Makefile Script。它负责收集自从上次调用 include $(CLEAR_VARS) 后的所有LOCAL_XXX信息。并决定编译为什么。
BUILD_STATIC_LIBRARY:编译为静态库。
BUILD_SHARED_LIBRARY :编译为动态库
BUILD_EXECUTABLE:编译为Native C可执行程序
授人以渔
关于Android.mk,我只是小作介绍
如果英文尚可,请直接翻阅,理解,继续学习.
http://android.mk/
另外,也可在ndk目录下寻找官方文档
例如 E:\android-ndk-r9d\docs中
Makefile语法介绍相关文档可百度
参考
http://blog.sina.com.cn/s/blog_602f8770010148ce.html
- Makefile和Android.mk的基情
- Android.mk和GNU Makefile
- android的makefile -- Android.mk
- Android.mk/makefile 的ifeq和ifdef的区别
- android的 makefile -- Android.mk 分析
- android的 makefile -- Android.mk 分析
- android的 makefile -- Android.mk 分析
- Makefile & Android.mk文件
- Makefile了解Android.mk
- android makefile(android.mk)分析
- Android makefile写法(Android.mk)
- android Makefile(Android.mk)解析
- 在Android.mk和Makefile文件中输出打印信息
- android中。makefile和.mk文件简单介绍
- android编译系统的makefile文件Android.mk写法
- 【转】android编译系统的makefile文件Android.mk写法
- android编译系统的makefile文件Android.mk写法
- android编译系统的makefile文件Android.mk写法
- OWASP 测试指南 4.0-测试原则
- python基础教程学习笔记十六
- FMDB的简单封装
- RxJava 和 RxAndroid 四(RxBinding的使用)
- Linux中gdb 查看core堆栈信息
- Makefile和Android.mk的基情
- oracle异地恢复
- QMediaPlayer播放视频
- 函数指针与回调
- RxJava 和 RxAndroid 五(线程调度)
- js指定滚动条位置
- 转载:SAE+Servlet+JSP实现微信公众平台OAuth2.0网页授权的使用
- HDU1029 Ignatius and the Princess IV
- Unity 中的旋转