Makefile编写和使用


一、Makefile

1、什么是Makefile

一个工程中的源文件不计其数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,因为 makefile就像一个Shell脚本一样,其中也可以执行操作系统的命令。

在Linux与Unix环境下使用GNU的make工具可以去构建一个工程,在这个工程中编译只需要一个命令就可以完成编译和运行等操作,不过它需要编写一个叫做Makefile的文件来指定一些编译或运行的规则。

虽然可能看起来编译一个Makefile文件好像比较麻烦,但是编写Makefile不仅可以让我们在之后的使用中通过极少的命令即可完成我们想要的操作,而且也极大的减轻了提供给别人使用时操作起来的复杂程度,我们只需要在shell提示符下输入对应的make命令即可自动化的进行编译等操作,所以说通过GNU make来构建和管理自己的工程是极有必要的。

2、Makefile编写

我们所常用的文件名是Makefile与makefile,我们可以任选其一创建:

vim makefile

创建后我们需要编辑makefile,首先makefile有三大元素:目标、动作、依赖。

在这里插入图片描述

目标: 目标就是相当于我们执行的时候的一个功能,我们可以选择,没有选择直接make则用的是主目标,第一个目标就是总目标(如上图的all目标),而当我们make的时候,可以在make后面加上对应目标,如install,则将执行install。

动作:动作就是目标下面的操作指令,也是目标需要去执行的命令,如上图中all目标所执行的是make install命令,他将继续执行install目标,而install目标的动作则是创建库文件夹并把动态库放入对应文件夹。动态库和静态库制作可以参考:动态库与静态库技术

依赖:在目标冒号后写依赖(如all后的clean与shared_lib),写它执行所需要的依赖文件等,如果没有则它不执行,不过makefile一般对于文件比较聪明,它默认会确保文件都在才能执行,所以我们不需要自己再写对文件的依赖,但是我们可以写一些其他目标作为依赖,它表示在执行下面动作的时候需要先执行依赖对应的目标。对于删除目标,我们可以在做编译的总目标中写删除目标的依赖,如all依赖clean,所以它会先去找这个文件删除了后再进行编译的操作。实现了编译前把之前的文件先删除的功能。

注意:makefile换行后必须是Tab不能是空格

当然除了三大元素以外,还有一个重要的就是变量了,合理运用变量可以让我们make时更加方便。

在这里插入图片描述

变量:变量是在所有目标之前的,通过"=“来创建变量,并给变量赋值,而在使用的时候我们用”${变量名}"来调用;设置变量可以统一相同的文件名等,然后通过修改变量即可统一修改文件中的变量;可以一边编写动作时一边编写变量,也可以在所有目标、动作和依赖都写完了再来写变量并修改对应的位置会比较逻辑清晰一点。

在这里插入图片描述

可见变量赋值也有多个类型:

  • 变量=值:表示直接赋值变量是不可变的,在make时不能改变。
  • 变量?=值:表示变量是可变的,可以在make时用“变量名=···”来重新赋值。
  • 变量+=值:表示变量是可追加,是把给的新的值追加在原由变量的后面。
  • 变量:=值:表示覆盖之前赋值,用于makefile当中,如果一个变量已赋值,用它再进行赋值将会覆盖之前的变量赋值。

二、使用方法

一般我们直接在shell提示符下输入对应的make命令即可,如下图src文件夹中的makefile,我们在shell提示符输入make即可制作动态库并安装到lib文件夹中去:

在这里插入图片描述
但是我们并没有进一步编译,因为编译在另一个文件夹(…/src)下的makefile中,所以我们可以在两个文件夹外再建立一个进行make操作的makefile:

在这里插入图片描述

在这个makefile中用echo做输出提示,而@echo与echo的直接区别就是@echo不会输出引号外的内容,而echo则会输出。

在主目标中通过make的-C选项来直接执行对应文件夹中的make,而其他目标中也可加上目标名来实现其他目标在对应文件夹中的操作,最终实现只需要make即可完成制作动态库和编译等一系列操作。


三、 总结

本篇介绍了makefile,讲解了makefile的编写与使用方法,在我们的工程项目中合理运用makefile可以让工程操作起来简单方便。

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 使用gcc和makefile编写c程序,可以通过以下步骤完成: 1. 编写c程序,例如hello.c。 2. 编写makefile文件,指定编译器和编译选项,以及目标文件和依赖关系。例如: ``` CC=gcc CFLAGS=-Wall -g TARGET=hello DEPS= $(TARGET): $(TARGET).o $(DEPS) $(CC) $(CFLAGS) -o $@ $^ %.o: %.c $(CC) $(CFLAGS) -c -o $@ $< ``` 3. 在命令行中输入make命令,即可自动编译生成可执行文件。例如: ``` $ make ``` 4. 运行可执行文件。例如: ``` $ ./hello ``` 以上就是使用gcc和makefile编写c程序的基本步骤。 ### 回答2: GCC是一种广泛使用的C编译器,对于编写C程序非常有帮助。而Makefile是一种构建工具,可以自动化编译程序。下面将逐步介绍如何使用GCC和Makefile编写C程序。 一、安装GCC 在使用GCC之前,你需要在系统中安装GCC。具体安装方法可以查找相关文档或者手册。安装完成后,可以在终端输入“gcc -v”命令来查看GCC是否安装成功。 二、创建Hello World程序 首先,需要创建一个Hello World程序。在终端中使用文本编辑器来创建一个C源文件。输入以下代码: #include <stdio.h> int main(){ printf("Hello, World!\n"); return 0; } 将文件保存为hello.c。 三、编译程序 接下来需要用GCC来编译程序。运行以下命令来编译hello.c: gcc -o hello hello.c 此命令将生成一个可执行文件hello。现在就可以运行这个文件,程序会输出“Hello, World!”。 四、使用Makefile 另一种编译程序的方法是使用Makefile来编译程序。在程序根目录中创建一个名为Makefile文件。在这个文件中,你需要定义目标文件、依赖关系和编译方式。可以将上文的hello.c程序改写成Makefile的形式: CC=gcc CFLAGS=-Wall hello: hello.o $(CC) $(CFLAGS) -o hello hello.o hello.o: hello.c $(CC) $(CFLAGS) -c hello.c .PHONY: clean clean: rm -f hello *.o 在这个Makefile中,使用了变量CC和CFLAGS来指定编译器和编译选项。然后定义了两个目标文件:hello和hello.o。第一个目标文件“hello”依赖于hello.o,指定了如何编译生成可执行文件。第二个目标文件“hello.o”依赖于hello.c,指定了如何编译生成.o文件。同时还定义了一个用于清理中间文件的环节。 现在你可以运行以下命令: make 这个命令会自动读取当前目录中的Makefile文件,并编译程序。若要清除目录中生成的中间文件,可以执行以下命令: make clean 总结 以上就是使用GCC和Makefile编写C程序的基本方法。当然还有其他的编译方式,如使用IDE等,但是学习使用GCC和Makefile可以让你更深入地理解编译程序的过程。希望以上方法能够帮助到大家。 ### 回答3: C语言是一门广泛应用的编程语言,它的应用范围涉及到操作系统、网络、数据库、多媒体等众多领域。为了方便编译、运行和维护C程序,我们常常使用gcc和makefile来进行编译和构建。 gcc(GNU Compiler Collection)是一款免费开源的编译器,它支持C、C++、Objective-C、Fortran和Ada等多种编程语言。gcc的优点是它有丰富的功能和灵活的配置选项,能够生成高效的机器码,还支持调试信息的生成和优化等功能。它是编译Linux等开源系统中C程序的标准编译器,也是许多跨平台应用的首选编译器。 makefile是一种文本文件,用来指定如何构建一个工程,它包含编译规则、目标文件、依赖关系和编译选项等信息。makefile中的关键字包括target、dependencies、commands、macros和variables等,通过这些关键字可以指定程序的编译方式和运行方式。makefile的优点是它能够自动化编译和构建,减少了手动编译的繁琐和错误。 下面我们以一个简单的C程序为例,来演示如何使用gcc和makefile进行编译和构建。 首先,我们创建一个名为hello.c的C程序文件,内容如下: #include<stdio.h> int main(){ printf("Hello, world!\n"); return 0; } 然后,我们使用gcc命令进行编译,生成可执行文件,命令如下: gcc -o hello hello.c 其中,“-o”选项用来指定输出文件的名称,“hello.c”为源程序文件名,“hello”为生成的可执行文件名。 接着,我们可以使用makefile来管理代码的构建过程。我们新建一个名为Makefile文件,内容如下: CC=gcc CFLAGS= LDFLAGS= .PHONY: all all: hello hello: hello.o $(CC) $(LDFLAGS) $^ -o $@ hello.o: hello.c $(CC) $(CFLAGS) -c $< -o $@ 其中,“CC”是编译器名称,“CFLAGS”是编译选项,“LDFLAGS”是链接选项,“.PHONY”是一个伪目标,“all”是一个目标,表示要构建的程序名称,“hello”是目标文件,“hello.o”是依赖文件,“$(CC)”和“$<”等是变量和自动变量,用来代替具体的值。 最后,我们可以使用“make”命令来进行构建。命令如下: make all 运行以上命令后,程序即可成功编译和构建。我们可以使用“./hello”命令来运行程序,输出“Hello, world!”的内容。 以上是使用gcc和makefile编写C程序的基本流程和示例。希望能对C语言的学习和实践有所帮助。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

邓永豪

打赏一下,好运来敲门!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值