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、去执行下

转载于:https://www.cnblogs.com/feipeng8848/p/9954982.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值