zoukankan      html  css  js  c++  java
  • Android系统开发(3)——Makefile的编写

    Makefile是什么?

    makefile的作用:

    1、工程文件组织,编译成复杂的程序

    2、安装及卸载我们的程序

    Makefile使用示例

    在/home/username/makefile目录下有如下三个文件:

    main.c

    #include <stdio.h>
    #include <stdlib.h>
    
    int main(int argc, char *argv[]){
            int x, y;
            sscanf(argv[1], "%u", &x);
            sccanf(argv[2], "%u", &y);
            printf("func1:%u
    ", func1(x, y));
            printf("func2:%u
    ", func2(x, y));
    
            return 0;
    }
    
    func1.c

    #include <stdio.h>
    
    int func1(int x, int y){
            return x + y;
    }
    
    func2.c

    #include <stdio.h>
    
    int func2(int x, int y){
            return x + y;
    }
    
    下面我们开始编译上面的文件:

    写好的Makefile文件如下:

    obj=main.c func1.c func2.c
    hello2:$(obj)
            gcc $^ -o $@
    .PHONY:clean
    clean:
            rm hello2
    install:
            cp hello2 /usr/local
    
    运行make

    Makefile的编写规则

    Makefile由若干条上面的规则构成,每个规则如下:

    taget目标:prequisites(依赖)

    command(命令)

    注意:第二行必须有一个Tab缩进

    例如上面两行表示要生成目标文件hello,在生成hello的同时需要依赖main.o func1.o func2.o这三个文件,并且执行gcc main.o func1.o func2.o -o hello命令来生成。

    #建立第一个Makefile文件
    hello:main.c func1.c func2.c
            gcc main.c func1.c func2.c -o hello
    
    我们来修改一下上面的Makefile

    #建立第二个Makefile文件
    hello:main.o func1.o func2.o
            gcc main.o func1.o func2.o -o hello
    main.o:main.c
            gcc -c main.c
    func1.o:func1.c
            gcc -c func1.c
    func2.o:func2.c
            gcc -c func2.c
    

    发现不仅生成了hello而且多了几个func1.c func1.o func2.c func2.o main.c main.o文件,下面我们修改一下Makefile文件,添加一个伪目标

    hello:main.o func1.o func2.o
            gcc main.o func1.o func2.o -o hello
    main.o:main.c
            gcc -c main.c
    func1.o:func1.c
            gcc -c func1.c
    func2.o:func2.c
            gcc -c func2.c
    
    clean:
            rm func1.o func2.o main.o
    clean就是一个伪目标,不会生成新的文件,下面我们来执行一下make clean来看一下效果

    执行make clean后func1.o func2.o main.o全部删除了(可以想到卸载程序的原理),下面我们就来添加一个install和uninstall伪目标

    在我们执行make install的时候会将我们用到的执行文件和库文件拷贝到指定目录,在执行uninstall的时候会删除安装时的拷贝文件。

    下面我们来使用变量MObj代替main.o func1.o func2.o

    MObj = main.o func1.o func2.o
    hello:$(MObj)
            gcc $(MObj) -o hello
    main.o:main.c
            gcc -c main.c
    func1.o:func1.c
            gcc -c func1.c
    func2.o:func2.c
            gcc -c func2.c
    
    clean:
            rm $(MObj) 
    install:
            cp hello /usr/local/hello
    uninstall:
            rm /usr/local/hello
    如果这样写MObj := main.o func1.o func2.o 表示不递归变量。也可以使用系统的预定义变量,常见的预定义变量如下:

    AR_____库文件维护程序的名称,默认值为ar

    AS_____汇编程序的名称,默认值为as

    CC_____C编译器的名称,默认值为cc

    CXX____C++编译器的名称,默认值为g++

    ARFLAGS_____库文件维护程序选项,无默认值

    ASFLAGS_____汇编程序选项,无默认值

    CFLAGS______C编译器选项,无默认值

    CXXFLAGS____C++编译器选项,无默认值

    下面我们使用预定义变量来改写一下我们上面的Makefile文件


    这样做的好处就是在我们换编译器的时候非常方便。

    下面我们来看看makefile中的自动变量及环境变量:

    $*_______不包含扩展名的目标文件名称

    $<_______第一个依赖文件名称

    $?_______所有时间戳比目标文件晚的依赖文件

    $@______目标文件完整名称

    $^_______所有不重复的依赖文件

    这个时候我们应该清楚了刚开始写的那个Makefile文件的内容了


    上面还对伪目标进行了声明(.PHONY)这样做的目的是为了避免和其他文件同名冲突。


  • 相关阅读:
    windwos8.1英文版安装SQL2008 R2中断停止的解决方案
    indwows8.1 英文版64位安装数据库时出现The ENU localization is not supported by this SQL Server media
    Server Tomcat v7.0 Server at localhost was unable to start within 45 seconds
    SQL数据附加问题
    eclipse,myeclipse中集合svn的方法
    JAVA SSH 框架介绍
    SSH框架-相关知识点
    SuperMapRealSpace Heading Tilt Roll的理解
    SuperMap iserver manage不能访问本地目的(IE9)
    Myeclipse中js文件中的乱码处理
  • 原文地址:https://www.cnblogs.com/lanzhi/p/6468828.html
Copyright © 2011-2022 走看看