Makefile入门

一、GCC编译
gcc 命令格式如下:
gcc [选项] [文件名字]
主要选项如下:
-c 只编译不链接为可执行文件,编译器将输入的.c 文件编译为.o 的目标文件。
-o<输出文件名> 用来指定编译结束以后的输出文件名,如果使用这个选项的话 GCC 默认编译出来的可执行文件名字为 a.out。
-g 添加调试信息,如果要使用调试工具(如 GDB)的话就必须加入此选项,此选项指示编译的时候生成调试所需的符号信息。
-O 对程序进行优化编译,如果使用此选项的话整个源代码在编译、链接的的时候都会进行优化,这样产生的可执行文件执行效率就高。
-O2 比-O 更幅度更大的优化,生成的可执行效率更高,但是整个编译过程会很慢。
GCC 编译器的编译流程是:预处理、汇编、编译和链接。预处理就是对程序中的宏定义等相关的内容先进行前期的处理。汇编是先将 C 文件转换为汇编文件。当 C 文件转换为汇编文件以后就是文件编译了,编译过程就是将 C 源文件编译成.o 结尾的目标文件。编译生成的.o 文件不能直接执行,而是需要最后的链接,如果你的工程有很多个 c 源文件的话最终就会有很多.o文件,将这些.o 文件链接在一起形成完整的一个可执行文件。
二、Makefile基础
2.1 makefile基本原则:
1)如果这个工程没有编译过,那么我们的所有 C 文件都要编译并被链接。
2)如果这个工程的某几个 C 文件被修改,那么我们只编译被修改的 C 文件,并链接目
标程。
3)如果这个工程的头文件被改变了,那么我们需要编译引用了这几个头文件的 C 文件,
并链接目标程序。
2.2 makefile格式
目标:依赖文件集
命令1
命令2

在这里插入图片描述如上图1-2行:这条规则的目标是 main,main.o、input.o 和 calcu.o 是生成 main 的依赖文件,如果要更新目标 main,就必须先更新它的所有依赖文件,如果依赖文件中的任何一个有更新,那么目标也必须更新,“更新”就是执行一遍规则中的命令列表。
以上事例的执行原理:
1、make 会在当前目录下找名字叫“Makefile”或“makefile”的文件。
2、如果找到,它会找文件中的第一个目标文件(target),在上面的例子中,他会找到
“main”这个文件,并把这个文件作为最终的目标文件。
3、如果 main文件不存在,或是main所依赖的后面的 .o 文件的文件修改时间要比 main
这个文件新,那么,他就会执行后面所定义的命令来生成 main 这个文件。
4、如果main所依赖的.o 文件也存在,那么 make 会在当前文件中找目标为.o 文件的依
赖性,如果找到则再根据那一个规则生成.o 文件。(这有点像一个堆栈的过程)
5、当然,你的 C 文件和 H 文件是存在的啦,于是 make 会生成 .o 文件,然后再用 .o 文
件生命 make 的终极任务,也就是执行文件 edit 了。
这就是整个 make 的依赖性,make 会一层又一层地去找文件的依赖关系,直到最终编译
出第一个目标文件.
三、格式简化
在这里插入图片描述如上图:1、依赖文件赋值给变量objects,后期增删文件时,只修改objects变量的赋值即可,简化工作量,类似于C的宏定义。
2、Makefile 中变量的引用方法是“$(变量名)”
3、第五行中使用模式规则,模式规则中,至少在规则的目标定义中要包涵“%”,否则就是一般规则,目标中的“%”表示对文件名的匹配,“%”表示长度任意的非空字符串。
当“%”出现在目标中的时候,目标中“%”所代表的值决定了依赖中的“%”值。
4、自动化变量
功能:通过一行命令来从不同的依赖文件中生成对应的目标。常用自动化变化如下:
在这里插入图片描述在这里插入图片描述如上图,第5行使用模式规则%,第六行表示符合模式规则的一系列文件的集合.
5、伪代码
Makefile 有一种特殊的目标——伪目标,一般的目标名都是要生成的文件,而伪目标不代表真正的目标名,在执行 make 命令的时候通过指定这个伪目标来执行其所在规则的定义的命令。
当我们需要执行一些命令,但并不需要生成对应文件的时候,最好声明为伪代码,防止产生预想外的结果。
在这里插入图片描述如上图所示,假如不做声明,又不小心在目录中创建了clean文件,则不会执行clean之后的代码。
在这里插入图片描述6、条件编译
在这里插入图片描述7、函数
在这里插入图片描述在这里插入图片描述
在这里插入图片描述

摘录自:【正点原子】I.MX6U嵌入式Linux驱动开发指南V1.0

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值