多数内容copy自youtube的一个视频:https://www.youtube.com/watch?v=E1_uuFWibuM

执行环境:原作者是在Linux下做的视频,而我使用的是win10,win10下使用mingw-w64、msys2来安装win下的gcc与make工具。安装mingw-w64和msys2(我安装后是不带make工具的,pacman命令安装的make)后配置下环境变量就可以使用gcc和make工具了。文本编辑器使用的是VS code。
一个可能用到的知识补充:https://www.biaodianfu.com/cygwin-ming-msys.html
mingw-w64官网:https://mingw-w64.org/doku.php/start
msys2官网:http://www.msys2.org/

一、为什么要用makefile

(1)简单编译一个c文件

命令:
gcc main.c -o main.exe
执行后会得到一个main.exe的文件。在控制台中执行下:

这样就得到了输出。但是,如果.c文件很多,参数也很多,gcc的命令就会很长,源文件做一点点的修改就要执行一次冗长的gcc命令。这时候就可以使用make工具,写一个makefile文件来执行编译。makefile的写法:

target是要编译的结果,冒号后面的dependencies是依赖,command是要执行的命令(command前面是一个tab不是空格),例如:

去控制台执行一下:

二、多个c文件的情况

为了试验,写下如下代码,共三个文件:

如果直接使用gcc命令编译的话,命令是:gcc main.c sayHello.c -o main.exe 如果文件特别多,只修改部分文件然后执行所有文件全部编译的话,明显会浪费时间。所以,这种情况下,就是对每个c文件单独编译,比如上图中的sayHello.c单独编译成sayHello.o,最后链接到main.c文件。借用原视频中的一个图来说明下:

那么,针对我第一张图中sayHello.c的makefaile就应该想下面这样写:

main.exe: main.c sayHello.o
gcc main.c sayHello.o -o main.exe
sayHello.o: sayHello.c
gcc -c sayHello.c -o sayHello.o


注意,按照顺序,是从上向下写,但编译是从下向上编译,也就是说,先编译sayHello.c成sayHello.o,然后编译main.c sayHello.o。注意上面编译sayHello.c的时候有个-c参数,意思是把源文件编译成.o的中间文件而不是.exe的可执行文件。
去执行下:

至此,已经得到的编译的结果并且执行也没问题,但是,由于编译过程中出现了中间文件*.o,编译后就没用了,如果有很多的话一个个删除不现实,所以在makefile中可以添加一个clean,如下:

main.exe: main.c sayHello.o
gcc main.c sayHello.o -o main.exe
sayHello.o: sayHello.c
gcc -c sayHello.c -o sayHello.o
clean:
rm *.o

执行下make clean就可以清理了:

三、makefile文件中的变量

上图中有三个c文件,分别都使用了“gcc”这个名字,试想下,如果有一百个c文件,那么就要写一百次gcc,如果换编译器,就要每一个都要修改,所以,使用一个变量来代替“gcc”就显得很有必要了。

执行效果如下:

下面也是变量的用法示例:

四、多个main函数的情况


上图是原视频中的makefile文件,换到win下,需要在可执行文件下添加.exe,例如我的例子就可以写成下面这样:
1、目录文件,我修改了两个main文件一个是main1.c另外一个是main2.c, 这两个文件内容是完全一样的

2、修改makefaile内容,变化部分用红色标出

3、去执行下

makefile基本操作的更多相关文章

  1. 使用vs code搭建C开发环境

    关于搭建vscode的开发环境来开发c网上已经有很多类似的贴子,但是几乎都是直接给出tasks.json和launch.json文件,并未说明这两个文件的作用以及如何配置.这里面向纯小白着重说明下(1 ...

  2. Makefile简易教程

    本文部分内容引用: 中文维基百科. 一个简单的Makefile教程. Makefile简介 在软件开发中,make通常被视为一种软件构建工具.该工具主要经由读取一种名为"makefile&q ...

  3. Linux基本操作笔记

    1.Linux是一个统称,内核是一致的.分为Linux系统管理员和Linux程序员包括管理和软件开发. 2.要掌握Linux,有四步,第一,在Linux平台上的开发,比如,vi.gcc.gdb等和Li ...

  4. Samsung_tiny4412(驱动笔记03)----字符设备驱动基本操作及调用流程

    /*********************************************************************************** * * 字符设备驱动基本操作及 ...

  5. C语言SQLite3基本操作Demo

    /************************************************************************** * C语言SQLite3基本操作Demo * 声 ...

  6. 说说Makefile那些事儿

    说说Makefile那些事儿 |扬说|透过现象看本质 工作至今,一直对Makefile半知半解.突然某天幡然醒悟,觉得此举极为不妥,只得洗心革面从头学来,以前许多不明觉厉之处顿时茅塞顿开,想想好记性不 ...

  7. Key/Value之王Memcached初探:二、Memcached在.Net中的基本操作

    一.Memcached ClientLib For .Net 首先,不得不说,许多语言都实现了连接Memcached的客户端,其中以Perl.PHP为主. 仅仅memcached网站上列出的语言就有: ...

  8. Android Notification 详解(一)——基本操作

    Android Notification 详解(一)--基本操作 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 源码:AndroidDemo/Notification 文中如有纰 ...

  9. Android Notification 详解——基本操作

    Android Notification 详解 版权声明:本文为博主原创文章,未经博主允许不得转载. 前几天项目中有用到 Android 通知相关的内容,索性把 Android Notificatio ...

随机推荐

  1. CSS3实现GIF动画

    来自 dribbble 某位大师的作品,GIF图中一个小女孩抱着一只猫在跑步,非常可爱,动作轻巧,过渡自然.DEMO下载 回到项目需求,要实现类似上图卡通人物跑步动画,分析结果如下: 1.跑步动画可以 ...

  2. python拼接变量、字符串的3种方法

    第一种,加号(“+”): print 'py'+'thon' # output python str = 'py' print str+'thon' # output python 第二种 ,空格: ...

  3. Opcode是啥以及如何使用好Opcache

    转载  https://www.zybuluo.com/phper/note/1016714 啥是Opcode? 我们在日常的PHP开发过程中,应该经常会听见Opcache这个词,那么啥是Opcode ...

  4. discuz用户组

    非公众用户组当用户组设置为“非公众用户组”时,无论是以主用户组的形式,还是以扩展用户组的形式,均只能由管理员手工将用户加入本组. 公众用户组当本用户组设置为“公众用户组”,且用户当前所在的用户组被允许 ...

  5. 【Hive学习之五】Hive 参数&动态分区&分桶

    环境 虚拟机:VMware 10 Linux版本:CentOS-6.5-x86_64 客户端:Xshell4 FTP:Xftp4 jdk8 hadoop-3.1.1 apache-hive-3.1.1 ...

  6. 为什么我们要使用HTTP Strict Transport Security?

    http://www.freebuf.com/articles/web/66827.html

  7. Linux服务器---邮件服务postfix安装

    安装postfix postfix是一个快速.易于管理.安全性高的邮件发送服务,可以配合dovecot实现一个完美的邮箱服务器. 1.安装postfix [root@localhost ~]# rpm ...

  8. golang学习笔记9 beego nginx 部署 nginx 反向代理 golang web

    golang学习笔记9 beego nginx 部署 nginx 反向代理 golang web Nginx 部署 - beego: 简约 & 强大并存的 Go 应用框架https://bee ...

  9. Redis内存分析方法

    一般会采用 bgsave 生成 dump.rdb 文件,再结合 redis-rdb-tools 和 sqlite 来进行静态分析. BGSAVE:在后台异步(Asynchronously)保存当前数据 ...

  10. 怎样从外网访问内网MySQL数据库?

    本地安装了一个MySQL数据库,只能在局域网内访问到,怎样从外网也能访问到本地的MySQL数据库呢?本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动MySQL数据库 默认安装的MySQL ...