据说做为高级工程师,一定会一点Makefile,那作为小白呢,也是可以做到的,本篇就用大白话跟大家梳理下,索性记录下点滴。留给自己也留给他人。
基本认识
程序员敲代码呢,大部分都是从一个hello world 开始的,那也不例外,从一个简单的main函数说起。这里就不对语言本身做过多的描述。我们就直奔主题。
基本语法格式
基本语法格式就是:
目标:依赖
命令
概念多了,也迷糊,直接一步一步实践。新建一个main.c
#include<stdio.h>
int main()
{
printf("Program start - Enter main\r\n");
return 0;
}
在linux环境下 输入
gcc main.c -o main
生成可执行程序 main
相信大家对这个操作,都不陌生。
这个输入命令“gcc main.c -o main” 生成可执行文件的过程,可以以某种规则的形式放进makefile文件里,让make工具帮你一步一步解析执行。这就是Makefile的作用,对的!就是这么简单。
入门操作
那我们把上边的过程放到基本语法格式中。进行对应,
-
1.生成的可执行程序main 就是你的目标
-
2.这里没有依赖任何文件
-
3.执行了gcc main.c -o main 就是命令。
新建一个Makefile文件,按照格式把这个内容 放入一个名叫Makefile的文件中
main:
gcc main.c -o main
保存,然后执行make,便会生成可执行程序main。对!Makefile就是这么简单。
这里说明下:
-
make 是一个独立的解释程序,是用来解析Makefile的。
-
程序编译,是Makefile中的命令调用了编译器gcc来完成编译的。这个概念要理清。
=====
至此,恭喜你已经入门了!
======
入门之后
相信有的读者,已经要问了,我代码中有很多c文件呀。要怎么做。比如在main中调用其他文件的函数。废话不多说。
新建一个文件fun_a.c
#include "stdio.h"
int fun_a()
{
printf("i am fun_a\r\n");
return 1;
}
按照同样的操作,我们可以把此文件的编译过程放入Makefile文件中。
在放入之前,先手动把命令执行下。
gcc fun_a.c -o fun_a
这个时候会报错。在这里要简单解释一下程序编译的过程,大神可以忽略哈,
一个可执行程序的生成经过:预编译---编译---链接。
-
预编译就不解释了。
-
编译是把.c文件编译为.o
-
链接是把.o文件链接为可执行程序
回到遇到的问题,因为fun_a是子函数非主函数,我们需要把fun_a先编译为.o
gcc -c fun_a.c -o fun_a.o
而之前执行的 gcc main.c -o main 是一步到位,把中间过程省略了。
main:
gcc main.c -o main
fun_a.o:
gcc -c fun_a.c -o fun_a.o
现在把函数调用放入main中
#include<stdio.h>
extern int fun_a();
int main()
{
printf("Program start - Enter main\r\n");
fun_a();
return 0;
}
执行
gcc main.c -o main
会提醒你找不带定义,这是因为 main中调用了 fun_a 而你虽然在上一步生成了fun_a.o但没有告诉gcc 链接进去。
可以输入:
gcc main.c -o main fun_a.o
可以看到程序正常生成,并能够运行。
现在,我可以把以上的操作的命令放到Makefile中。
main:
gcc main.c -o main fun_a.o
fun_a.o:
gcc -c fun_a.c -o fun_a.o
在执行make之前,我们先把之前手动生成的.o 文件删除。
然后执行make.
哦?报错了!
原因是fun_a.o文件没有。
回到我们之前提到的 Makefile的基本格式。我们始终没有填写依赖项,而根据之前的操作来看,我们是需要fun_a.o的。于是,在依赖项处填上需要的文件名。
main:fun_a.o
gcc main.c -o main fun_a.o
fun_a.o:
gcc -c fun_a.c -o fun_a.o
继续执行make。生成了 可执行程序。对的!就是这么简单!
=====
至此,恭喜你已经掌握了Makefile的基本知识,可以随心所欲的去改写你的Makefile文件,让make完美的为你服务了。
=====
网上有很多教程。可能看了很多,不如自己去操作一遍。
Makefile还有很多其他的技巧,这里就不展开了,如果感兴趣,后续可以再补充哈,
希望这一步一步的操作,能帮助到你。也可以关注交流。
最后,如果要深入研究,可以异步GNU官网了解哈。
GNU Make Manual - GNU Project - Free Software Foundation