主动搜索而来的,可以不读这一大段!
我是在一本叫做《30天编写操作系统》的那本书上听说过makefile的,后来发现书里的很多东西我编译失败,遂放弃这本书。以后有时间还得重新捡起来读一下。
近期在学习c语言描述的数据结构与算法的时候,特别的想写多文件(一个文件的内容太多的话,看着头疼),然后编译的时候就出现了gcc a.c b.c d.c...的命令,头疼!随意makefile就回来了!那么makefile是干什么的也就显而易见了,多文件编译!
根据我之前学习的makefile的经历,岂不是说:每多一个源文件,就得改写下makefile?想想都头疼!不过感觉自己是多虑了!毕竟这么多年了,还是大家都说好的软件,这些问题肯定是不存在的。如果存在只能说明:技术还不到家!如果确实是技术到家了,那么为开源世界做贡献的时刻就到了!哈哈哈哈哈哈哈哈...
我的操作系统是windows,所以环境必须得自己折腾下(头疼中...),Linux没搞过,估计有现成的。
这个就不用多说了吧!
所以如果是linux系统的话,我也不知道好不好使
可不喜欢安装这个了!感觉特别的麻烦!我找到的是在线安装器,特别不方便。有时间出一个教程,这里给个sourceforge上的下载器安装地址。
sourceforge下载地址:MinGW-w64 - for 32 and 64 bit Windows download | SourceForge.net
当然,也建议去光网逛逛:https://mingw-w64.org/
make是GNU下的项目,官网上没找到下载连接。搜索make for windows才找到的
make:就是GNU的make,网址:Make - GNU Project - Free Software Foundation
make for windows网址:Make for Windows (sourceforge.net)
系统自带的powershell,因为这货可以再任意文件里快速调出
先来一个makefile,然后再琢磨琢磨makefile到底是个啥!(我就这习惯)
我们需要也给正常的C文件,这里就用大名鼎鼎的helloworld了!
/*
* 第一个makefile的程序源码:helloworld.c
*/
#include
int main(void)
{
printf("Hello world\n");
return 0;
}
这里就保存文件为helloworld.c了。
接下来编译运行下看看:
程序正常!
新建一个文本文档,文件名改为makefile ,然后再里面码上这些东西(先不用管为什么):
(万恶的插入代码里,没有makefile模板)
注意:gcc前面的点一下tab出来的!不是空格,不是空格,不是空格!
Hello: hello.c
gcc hello.c
保存后,运行下看看效果:
首先清除一下所有的之前产生的文件(看官们可以再图形界面里操作,也可以用del指令一个一个来!下图中,我先ls一下,证明我的文件夹里只有两个文件hello.c和刚才写好的makefile (这个用type把内容打出来):
make编译与gcc直接编译:
写好makefile后,再次编译的时候,直接输入make就可以了!make会自动寻找当前文件夹下的makefile文件(老板的make要求makefile里的m大写),然后根据里面的规则去编译程序。这里的规则是啥呢?
第一行:Hello: hello.c
make找到makefile文件后,做的第一件事情,自然是读入第一行!第一行又被冒号分成了两个部分。
其中冒号前面的,可以暂时理解为我们给接下来的一堆指令(虽然这里只有一条)起的名字
冒号后面的,则是告诉下面这群指令可以使用的源文件。
第二行: gcc hello.c
这句话就是刚才说的一堆的命令了(只是这里只有一句话)。既然是一堆指令,那么也自然可以给他加上很多其他指令,比如windows下可以试试dir指令
确实可以运行:
这里再次强调一下:指令前面必须有tab!否则编译会出错!
两个tab行吗?我测试的这个简单的makefile可以,以后学习更多的内容后就不晓得了
刚才说到,makefile里的第一行是给这一堆指令起名字,那么可不可以多起几个名字呢?
还有,这个名字可不可以不接任何的文件呢?
这里写一个makefile文件,供大家课外研究使用
Hello: hello.c
gcc hello.c
DIR:
dir
上述文件中有连个名字,一个是Hello,一个是DIR,保存后,我们再次运行下make:
(清理多余文件,展示我的Makefile,运行make,执行程序)
看起来好像第二个DIR没啥用。其实只是这里没用。
这里我们可以显性的去执行下DIR这个名字后面的指令:
啥啥都有,啥啥都不缺!
而且,冒号后面是可以啥啥都没有的!
我们可以利用这一特性去一次性删除哪些不需要的文件,比如这样的makefile:
Hello: hello.c
gcc hello.c
clean:
del a.exe
这样,每次执行make clean就可以直接把a.exe给删除了。