makefile基本操作
多数内容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基本操作的更多相关文章
- 使用vs code搭建C开发环境
关于搭建vscode的开发环境来开发c网上已经有很多类似的贴子,但是几乎都是直接给出tasks.json和launch.json文件,并未说明这两个文件的作用以及如何配置.这里面向纯小白着重说明下(1 ...
- Makefile简易教程
本文部分内容引用: 中文维基百科. 一个简单的Makefile教程. Makefile简介 在软件开发中,make通常被视为一种软件构建工具.该工具主要经由读取一种名为"makefile&q ...
- Linux基本操作笔记
1.Linux是一个统称,内核是一致的.分为Linux系统管理员和Linux程序员包括管理和软件开发. 2.要掌握Linux,有四步,第一,在Linux平台上的开发,比如,vi.gcc.gdb等和Li ...
- Samsung_tiny4412(驱动笔记03)----字符设备驱动基本操作及调用流程
/*********************************************************************************** * * 字符设备驱动基本操作及 ...
- C语言SQLite3基本操作Demo
/************************************************************************** * C语言SQLite3基本操作Demo * 声 ...
- 说说Makefile那些事儿
说说Makefile那些事儿 |扬说|透过现象看本质 工作至今,一直对Makefile半知半解.突然某天幡然醒悟,觉得此举极为不妥,只得洗心革面从头学来,以前许多不明觉厉之处顿时茅塞顿开,想想好记性不 ...
- Key/Value之王Memcached初探:二、Memcached在.Net中的基本操作
一.Memcached ClientLib For .Net 首先,不得不说,许多语言都实现了连接Memcached的客户端,其中以Perl.PHP为主. 仅仅memcached网站上列出的语言就有: ...
- Android Notification 详解(一)——基本操作
Android Notification 详解(一)--基本操作 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 源码:AndroidDemo/Notification 文中如有纰 ...
- Android Notification 详解——基本操作
Android Notification 详解 版权声明:本文为博主原创文章,未经博主允许不得转载. 前几天项目中有用到 Android 通知相关的内容,索性把 Android Notificatio ...
随机推荐
- Installing IIS 8 on Windows Server 2012微软官方安装指导
from: https://www.iis.net/learn/get-started/whats-new-in-iis-8/installing-iis-8-on-windows-server-20 ...
- html5粒子连线
<html> <head> <title></title> <meta charset="utf-8" /> <s ...
- [9]Windows内核情景分析 --- DPC
DPC不同APC,DPC的全名是'延迟过程调用'. DPC最初作用是设计为中断服务程序的一部分.因为每次触发中断,都会关中断,然后执行中断服务例程.由于关中断了,所以中断服务例程必须短小精悍,不能消耗 ...
- centos python2升级为python3 升级旧版本django
阿里云centos python3 及django的配置 安装python3后 pip 会把下载的包安入python2.7 下面解决该问题 python3.5安装1,安装依赖包#yum install ...
- windows8安装msi或exe软件提示2503错误的解决办法
windows8以后的版本安装msi软件(比如nodejs.msi.Git.msi.python.msi.T ortoiseSVN.msi)的时候老师出现2503.2502的错误,究其原因还是系统权限 ...
- jQuery事件--keypress([[data],fn])和trigger(type,[data])
keypress([[data],fn]) 概述 当键盘或按钮被按下时,发生 keypress 事件 keypress 事件与 keydown 事件类似.当按钮被按下时,会发生该事件.它发生在当前获得 ...
- Explorer Bo (思维 + 树链剖分)
题意:求用最少的链覆盖所有的边用最少的总链长度. 思路:为了使得使用的链最少,我们可以知道使用的数量应该是(子叶 + 1)/ 2. 画图可知:当节点下的边数是偶数时,为了将该父节点上的边给连接上,所以 ...
- uva 1633 Dyslexic Gollum
题意: 给出n和k,求出长度为n的不包含长度大于等于k的回文串的01字符串的个数. 思路: 如果一个字符串包含长度为k的回文串,那么它肯定包含长度为k-1的回文串,所以考虑第i位的时候,只要前缀中不包 ...
- 【2017-2-19】C#数据类型,数据转换,变量,常量,转义符
数据类型 一.基本数据类型 1.值类型(不可以为null) ⑴整型(可以为负数) byle,int,short,long(从小到大排列) 常用整型 int a=值(小于10位数) long b=值(1 ...
- MVC中修改Table值
记录下: 遇到这样一个问题,表中有一个Char栏位,为1/0 ,只是在视图界面 让其显示为 开始/结束, 目前想到的两种解决办法: ①后台写查询的SQL时,直接写 SELECT a.Status, ( ...