make 是一个命令工具,它解释 Makefile 中的指令(应该说是规则) 。在 Makefile
文件中描述了整个工程所有文件的编译顺序、编译规则。Makefile 有自己的书写格式、
关键字、函数。像 C 语言有自己的格式、关键字和函数一样。而且在 Makefile 中可以
使用系统 shell 所提供的任何命令来完成想要的工作。Makefile(在其它的系统上可能
是另外的文件名)在绝大多数的 IDE 开发环境中都在使用,已经成为一种工程的编译
方法。
命令:gcc为命令,他是GNU编译器,用于c/c++等编译
GCC最基本的用法是∶gcc [options] [filenames] 其中options就是编译器所需要的参数,filenames给出相关的文件名称。
-c,只编译,不链接成为可执行文件,编译器只是由输入的.c等源代码文件生成.o为后缀的目标文件,通常用于编译不包含主程序的子程序文件。
#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
#变量
#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:clean
clean:
rm -f *.o
rm -f myapp
#递归展开式
#可以引用还没有定义的变量,展开是引用时展开
str2=$(str1)
str1=hello
#直接展开式
#必须引用定义好了的变量,定义之后就会展开
str3 := android
str4 := $(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)
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变量必须定义来确定每个模块你在Android.mk描述。名称必须独特* *和不包含
任何空间。注意,构建系统将自动添加适当的前缀和后缀生成相应的文件。换句话说,
共享库模块命名“foo”将生成“libfoo.so”。
LOCAL_SRC_FILES变量必须包含将要打包如模块的C/C++ 源码。不必列出头文件,build System 会自动帮我们找出依赖文件。
缺省的C++源码的扩展名为.cpp. 也可以修改,通过LOCAL_CPP_EXTENSION。
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