Makefile gcc 测试c编译流程.c->.i->.s->.o->可执行程序

# a.c->a.i->a.s->a.o->a
# .i 文件生成 -E(编译过程在预处理结束) gcc -E a.c -o a.i
# .s 文件生成 -S(编译过程在生成汇编代码结束) gcc -S a.i -o a.s
# .o 文件生成 -c(编译过程在汇编转为二进制后结束,不进行链接 -m32 生成32位汇编代码) gcc -c a.s -o a.o -m32
#可执行文件生成 gcc a.o -o a

a.i: a.c a.h
gcc -E a.c -o a.i
a.s: a.i
gcc -S a.i -o a.s
a.o: a.s
gcc -c a.s -o a.o
a: a.o
gcc a.o -o a

# Makefile 规则: 目标文件:依赖文件 a.i: a.c a.h
# Makefile 变量 变量名=123 $(变量名)
# Makefile 隐含变量
# $* 不包括扩展名的目标文件 a.i:a.c a.h $*=a
# $@ 包括扩展名的全部目标文件 a.i:a.c a.h $@=a.i
# $^ 所有的当前条目的依赖文件 a.i:a.c a.h $^=a.c a.h
# $< 第一个依赖文件 a.i:a.c a.h $<=a.c

# Makefile 函数调用 $(函数名 参数)
# $(wildcard *.c) --在当前文件夹下查找所有的.c文件
# $(patsubst %.c,%.o,main.c file.c) --参数 被替换的东西 想要替换成的东西 所有内容

SRC=$(wildcard *.c)
OBJ=$(patsubst %.c, %.o, $(SRC))
CC=gcc

hello:$(OBJ)
$(CC) -o $@ $^

.c.i:
$(CC) -E -o $*.i $<
# # .i.s 隐含规则 相当于 %.s:%.i
.i.s:
$(CC) -S -o $*.s $<
.s.o:
$(CC) -c -o $*.o $<
.c.o:
$(CC) -c -o $*.o $<

#伪指令 后面的命令不进行依赖检查
.PHONY: clean
clean:
rm -rf *.i *.s *.o hello
test:
echo $(SRC)
echo $(OBJ)

#vars.mk 调试变量 make -f Makefile -f var.mk OBJ
%:
  @echo '$*=$($*)'
d-%:
  @echo '$*=$($*)'
  @echo ' origin = $(origin $*)'
  @echo ' value = $(value $*)'
  @echo ' flavor = $(flavor $*)'

c基础-Makefile的更多相关文章

  1. 1-3 编程基础 makefile工程管理

    GNU make Linux程序员必须学会使用GNU make来构建和管理自己的软件工程.GNU的make能够使整个工程的编译.链接只需要一个命令就可以完成. makefile make在执行时,需要 ...

  2. (二)我的Makefile学习冲动&&编译过程概述

    前言 一 年轻的冲动 二 学习曲线 1 Makefile基本语法 2 bash基础 3 world 三 编译过程概述 1 主机预装工具 2 编译host工具 3 编译交叉工具链 4 编译内核模块 5 ...

  3. Makefile 跟着走快点

    引言  - 从"HelloWorld"开始 Makefile 是Linux C 程序开发最重要的基本功. 代表着整个项目编译和最终生成过程.本文重点是带大家了解真实项目中那些简易的 ...

  4. 《Linux内核设计与实现》CHAPTER17阅读梳理

    <Linux内核设计与实现>CHAPTER17阅读梳理 [学习时间:3.5hours] [学习内容:设备类型,模块,内核对象,sysfs] 个人思考部分见[]标出的部分 一.课堂讲解整理& ...

  5. 20135220谈愈敏Linux Book_17

    第17章 设备与模块 关于设备驱动和设备管理的四种内核成分: 设备类型:在所有 Unix 系统中为了统一普通设备的操作所采用的分类. 模块: Linux 内核中用于按需加载和卸载目标码的机制. 内核对 ...

  6. 《Linux课本》读书笔记 第十七章 模块

    设备与模块: 设备类型:块设备(blkdev).字符设备(cdev).网络设备: 模块: 分析hello,world模块代码.Hello_init是模块的入口点,通过module_init()注册到系 ...

  7. Android中添加自己的模块 【转】

    本文转载自:http://wallage.blog.163.com/blog/static/17389624201021791333695/ 转:http://blog.csdn.net/yili_x ...

  8. Linux学习二:Makefile基础

    文首感谢http://www.chinaunix.net 作者:gunguymadman的分享 makefile关系到了整个工程的编译规则.一个工程中的源文件不计数,其按类型.功能.模块分别放在若干个 ...

  9. Linux平台Makefile文件的编写基础入门(课堂作业)

    根据老师的要求,写一个超简单的makefile准备:       准备三个文件:file1.c, file2.c, file2.h       file1.c: #include "file ...

  10. Linux平台Makefile文件的编写基础篇(转)

    目的:       基本掌握了 make 的用法,能在Linux系统上编程.环境:       Linux系统,或者有一台Linux服务器,通过终端连接.一句话:有Linux编译环境.准备:      ...

随机推荐

  1. ISE_14.7_Windows10安装

    直接下载安装会报如下错误: There was an unexpected error executing Import ISE Virtual Appliance 解决方案 1.阅读xilinx手册 ...

  2. Java内存分析利器——Eclipse Memory Analyzer工具的使用

    一.如何下载Java程序的dump内存文件并离线导入到MemoryAnalyser工具进行分析 1.jps查看Java应用的pid   jps 11584216168084 Launcher24792 ...

  3. OpenGL错误记录

    OpenGL3之--三角形(无法解析的外部符号 __imp__glClear@4,该符号在函数 _main 中被引用) 添加头文件 #include <GL/glut.h>

  4. vscode格式化

    1.tslint    TypeScript的格式化 2.esLint 3.prettier 4.vetur    格式化html,css,vue

  5. kolla

    kolla项目是为了容器化openstack,目标是做到100个节点的开箱即用,所有的组件的HA都具备.kolla是一个革命性的项目,我们以前积累的安装部署经验,全部都报废.使用kolla可以快速部署 ...

  6. SQL语句中索引失效的原因

    SQL语句中索引失效的情况. 总结如下: 1. 索引字段进行判空查询时.也就是对索引字段判断是否为NULL时.语句为is null 或is not null. select * from 表一 whe ...

  7. 复习第二点-2.基于注解的helloworld

    web.xml <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="htt ...

  8. IsNotEmpty和isNotBlank的区别

    isNotEmpty和isNotBlank都是判断字符串非空首先查看isNotEmpty( )isNotEmpty判断是否为空(null或size=0),不为空就返回true StringUtils. ...

  9. SpringBoot代理图片、文件等路径

    在config文件夹下新增一个配置类即可 /** * @author cyl * @time 2022/10/25 */ @Configuration public class UrlConfig e ...

  10. 地理信息技术GIS学习(3):数据表操作、图表制作、地图编辑(上海市行政区划图)

    数据表操作.图表制作内容主要来自 张明明的<ArcGis 10.1 超级学习手册>,其博客的电子数据已经找不到. 一.数据表操作 ArcMap中以属性表的形式来组织和管理要素的属性信息.每 ...