zoukankan      html  css  js  c++  java
  • linux开发之Makefile

    第一部分 通用Makefile

    #指定交叉编译工具链
    CROSS_COMPILE = arm-linux-

    AS = $(CROSS_COMPILE)as
    LD = $(CROSS_COMPILE)ld
    CC = $(CROSS_COMPILE)gcc
    CPP = $(CC) -E
    AR = $(CROSS_COMPILE)ar
    NM = $(CROSS_COMPILE)nm
    STRIP = $(CROSS_COMPILE)strip
    OBJCOPY = $(CROSS_COMPILE)objcopy
    OBJDUMP = $(CROSS_COMPILE)objdump

    # export导出的变量是给子目录下的Makefile使用的
    export AS LD CC CPP AR NM STRIP OBJCOPY OBJDUMP

    # 编译器在编译时的参数设置
    CFLAGS := -Wall -O2 -g -DDEBUG
    # 添加头文件路径,不添加的话include目录下的头文件编译时找不到
    CFLAGS += -I $(shell pwd)/include -I/opt/libdecode/include

    # 链接器的链接参数设置,链接库
    LDFLAGS := -ljpeg -lz -lpng -L/opt/libdecode/lib

    export CFLAGS LDFLAGS

    TOPDIR := $(shell pwd)
    export TOPDIR

    # 定义将来编译生成的可执行程序的名字
    TARGET := video2lcd

    # 添加项目中所有用到的源文件,有顶层目录下的.c文件,和子文件夹
    # 添加顶层目录下的.c文件
    obj-y += main.o

    # 添加顶层目录下的子文件夹(注意目录名后面加一个/)
    obj-y += main.o
    obj-y += convert/

    all:
    make -C ./ -f $(TOPDIR)/Makefile.build
    $(CC) $(LDFLAGS) -o $(TARGET) built-in.o

    cp:
    cp ../testproject/ /root/rootfs/ -rf

    clean:
    rm -f $(shell find -name "*.o")
    rm -f $(TARGET)

    distclean:
    rm -f $(shell find -name "*.o")
    rm -f $(TARGET)


    第二部分 Makefile基本语法

    make命令根据文件更新的时间戳来决定哪些文件需要重新编译,这使得可以避免编译已经编译过的程序,提高编译效率。

    1、Makefile规则
    目标(target)...: yon依赖(prerequiries)...
    <tab>命令(command)

    目标:通常是要生成的文件的名称,可以是可执行文件,也可以是一个执行的动作名称。
    依赖:用来产生目标的原材料(比如源文件),一个目标经常有几个依赖。
    命令:生成目标时执行的动作(每个规则可以有可以含有几个命令)


    2、Makefile常用函数,
    函数调用格式为 $(function arguments)
    解析:这里"function"是函数名,"arguments"是该函数的参数。参数和函数名之间用空格和Tab隔开,如果有多个参数,它们之间用逗号隔开。

    (1)字符串替换和分析函数 $(subst from,to,text)
    说明:在文本"text"中使用"to"替换每一处"from"。
    eg: $(subst ee,EE,feet on the street) 结果为 "fEET on the strEEt"
    (2)$(patsubst pattern,replacement,text)
    说明:寻找"text"中符合格式"pattern"的字,用"replacement"替换它们。"pattern"和"replacement"中可以使用通配符。
    eg: $(patsubst %.c,%.o,x.c.c bar.c) 结果 "x.c.o bar.o"
    (3)$(strip string)
    说明:去掉前导和结尾空格,并将中间的多个空格压缩为单个空格。
    eg: $(strip a b c) 结果 "abc"

    3、Makefile中的特殊字符
    (1)"$@" 表示规则的目标文件名;
    (2)"$^" 表示所有依赖的名字,名字之间用空格隔开;
    (3)"$<" 表示第一个以来的文件名

  • 相关阅读:
    对JAVA集合进行遍历删除时务必要用迭代器
    设计模式之单例模式(线程安全)
    List、Set、Map 和 Queue 之间的区别
    HashMap和Hashtable的区别
    Java WeakReference的理解与使用
    Java 理论与实践: 正确使用 Volatile 变量
    java中volatile关键字的含义
    最近5年183个Java面试问题列表及答案[最全]
    淘宝一月上钻是这样操作的
    Revit API找到风管穿过的墙(当前文档和链接文档)
  • 原文地址:https://www.cnblogs.com/gzqblogs/p/10202429.html
Copyright © 2011-2022 走看看