makefile是生成文件的脚本 , 把当前文件下的.c文件生成.o文件和可执行程序

  1. SRC = $(wildcard *.c)
  2. OBJS = $(patsubst %.c,%.o,$(SRC))
  3. CC = gcc
  4. FLAG = -g -static
  5. LIB =
  6. DEFS =
  7. INCLUDE =
  8. TARGET = helloworld
  9. $(TARGET):$(OBJS)
  10. $(CC) $(FLAG) $(DEFS) $^ -o $@ $(LIB)
  11. .PHONY:
  12. clean:
  13. rm -rf *.o $(TARGET)

gcc -g hello.c -o hello -g后面是依赖文件 -o后面是要生成的目标文件
gcc -g -o hello hello.c 可以换一下位置效果同上  
  -c 编译而不链接
  -o 生成的文件 .c .i .s .o
  -g 生成带字符表的程序
  -D 快速控制代码是否执行 和#ifdefine 作用一样
  -I 可指定查找include文件的其他位置 如:$cc -c -I/usr/local/include -I/opt/include hello.c
  -L 指定链接库的搜索目录 , -l(小写L)指定链接库的名字
  -Wall 提升警告
  -g后面什么都不加就是动态链接库 -g后面加-static 静态

makefile里面的代码
  目标文件:依赖文件
  hello.o:hello.c
  gcc -g -o hello.o hello.c
#变量
  1.定义变量
    OBJ = 文件名 不可追加的变量
    OBJ := 可追加的变量
    OBJ += 追加
  2.使用变量
    ${} 或 $() 使用变量
  3.通配符
    % * ? % 任意一个 * 全部 ? 匹配 如 1?3 找到123 133 143
    $@ 代表目标文件
    $^ 代表依赖文件
    $< 代表第一个依赖文件
要生成target要依赖于 xxx.o xxxx.o 但是没有.o文件会跳到下一句生成.o再执行生成和target和递归(到来边界才会执行下一句)差不多
  

  1. object := xxx.o xxxx.o
  2. $(target):$(object)
  3. $(CC) $(FLAG) $^ -o $@
  4. %.o:%.c
  5. $(CC) $(FLAG) $^ -o $@
  6. .PHONY:
  7. clean:
  8. rm -rf *.o $(target)

利用编译器的隐式规则

  1. object := xxx.o xxxx.o
  2. $(target):$(object)
  3. $(CC) $(FLAG) $^ -o $@
  4. .PHONY:
  5. clean:
  6. rm -rf *.o $(target)

4.隐式规则 如果你要生成 .o文件就必须要先 .c -> .i -> .s 才能生成 .o 但是编译器会智能的帮你经过中间的过程
5.函数

  1. //$(函数名 函数参数)如:
  2. SRC = $(wildcard *.c) //wildcard 提取当前文件下面的某个文件
  3. OBJS = $(patsubst %.c,%.o,$(SRC)) //patsubst 字符串替换函数 把SRC里的 .c 替换成.o
  4. CC = gcc
  5. FLAG = -g
  6. DEFS =
  7. LIB = -ltermcap //-lpthread // -L/word/abc.so
  8. INCLUDE=
  9. $(target):$(object)
  10. $(CC) $(FLAG) $^ -o $@ $(LIB)
  11. .PHONY:
  12. clean:
  13. rm -rf *.o $(target)

#多文件makefile的使用
  把顶层Makefile, Makefile.build放入程序的顶层目录 , 修改target , 修改obj-y
  再在每个子文件里新建一个makefile 把obj-y+=%.o

Linux基础(02)MakeFile的创建和使用的更多相关文章

  1. Linux基础 -02

    3.4 虚拟机快照技术 什么是快照 3.5 虚拟机克隆技术 什么是克隆 4.Bash Shell快速入门 4.1 什么是Bash Shell bash shell是一个命令解释器,主要负责用户程序与内 ...

  2. 《前端运维》一、Linux基础--02用户与权限

    其实说真的,这些基础挺枯燥的,内容呢绝大多数都是些静态的. 上一篇文章我们学习了基本的指令和vim编辑器的操作方法.这篇文章我们主要来学习下Linux中用户的概念和权限相关的知识. 一.用户与用户组 ...

  3. Linux基础02

    ** Linux基本操作常用命令(二) ** 用户名与主机名 当你进入Linux终端时,你会看到如下样式的图片:     其中[z@z01]方括号内的z表示当前系统登录操作的用户名,@后的z01表示当 ...

  4. Linux基础学习-用户的创建修改删除

    用户添加修改删除 1 useradd添加用户 添加一个新用户hehe,指定uid为3000,家目录为/home/haha [root@qdlinux ~]# useradd -u 3000 -d /h ...

  5. Linux基础学习系列目录导航

    Linux基础学习-通过VM安装RHEL7.4 Linux基础学习-命令行与图形界面切换 Linux基础学习-基本命令 Linux基础学习-RHEL7.4之YUM更换CentOS源 Linux基础学习 ...

  6. Linux基础命令-02

    Linux基础命令-02:

  7. Linux基础命令-Nginx-正则表达式( grep sed awk )-Shell Script--etc

    Linux基础使用 学习内容博客 内存 查看swap分区信息 > swapon -s 添加swap分区 > mkswap /dev/sdb2 > 激活 swapon -a /dev/ ...

  8. 全栈必备Linux 基础

    Linux 几乎无处不在,不论是服务器构建,还是客户端开发,操作系统的基础技能对全栈来说都是必备的.系统的选择Linux发行版本可以大体分为两类,一类是商业公司维护的发行版本,一类是社区组织维护的发行 ...

  9. 运维之Linux基础(二)

    运维之Linux基础(二) 1. file 命令基期用法 2. 文件系统 Linux的文件系统结构是树状结构,所有的文件都在/root跟目录下 /boot:系统启动相关的文件, 如:内核.initrd ...

随机推荐

  1. X86 下的SSDT HOOK

    目录 SSDTHOOK 1.SSDTHOOK 原理. 1.x32下的SSDT HOOK 2.SSDT HOOK代码 3.结果 4.总结 SSDTHOOK 1.SSDTHOOK 原理. x32下,直接获 ...

  2. MyBatis智能标签!

    if 语句 <select id="getOne" resultType="com.mybatis.entity.SmbmsProviderEntity" ...

  3. Java动态代理实现方式一

    Java代理设计模式(Proxy)的四种具体实现:静态代理和动态代理 实现方式一:静态代理 静态代理方式的优点 静态代理方式的缺点 Java动态代理实现方式一:InvocationHandler Ja ...

  4. Dice Similarity Coefficent vs. IoU Dice系数和IoU

    Dice Similarity Coefficent vs. IoU Several readers emailed regarding the segmentation performance of ...

  5. seqtk 一款快速处理fasta/fastq 文件的小程序

    seqtk 的 GitHub 官网 https://github.com/lh3/seqtk 安装 git clone https://github.com/lh3/seqtk.git cd seqt ...

  6. 高通qxdm抓取sensor的log【学习笔记】

    高通qxdm抓取sensor的log 打开qxdm,打开设置界面,去掉其他无关的log,打开Log packets .Message packets的SNS的log 之后需要把端口打开,把端口打开之后 ...

  7. Evolutionary approaches towards AI: past, present, and future

    Evolutionary approaches towards AI: past, present, and future 2019-10-06 07:28:13 This blog is from: ...

  8. 【传输协议】thrift的IDL语法

    一.IDL Thrift 采用IDL(Interface Definition Language)来定义通用的服务接口,然后通过Thrift提供的编译器,可以将服务接口编译成不同语言编写的代码,通过这 ...

  9. Ubuntu 16.04.4 LTS下安装OpenSSL

    1.下载openssl,本次下载的版本是openssl-1.1.0l.tar.gz : 地址  https://www.openssl.org/source/openssl-1.1.0l.tar.gz ...

  10. hive函数 get_json_object

    pandas和SQL数据分析实战 https://study.163.com/course/courseMain.htm?courseId=1006383008&share=2&sha ...