首页 > 其他分享 >C语言makefile文件

C语言makefile文件

时间:2022-11-22 22:34:21浏览次数:52  
标签:文件 book46 编译 make makefile C语言 book1 public


文章目录

  • ​​一、makefile的编写​​
  • ​​二、make命令​​
  • ​​三、makefile文件中的变量​​
  • ​​四、应用经验​​
  • ​​五、课后作业​​
  • ​​六、获取视频教程​​
  • ​​七、版权声明​​


在软件的工程中的源文件是很多的,其按照类型、功能、模块分别放在若干个目录和文件中,哪些文件需要编译,那些文件需要后编译,那些文件需要重新编译,甚至进行更复杂的功能操作,这就有了我们的系统编译的工具。

在linux和unix中,有一个强大的实用程序,叫make,可以用它来管理多模块程序的编译和链接,直至生成可执行文件。

make程序需要一个编译规则说明文件,称为makefile,makefile文件中描述了整个软件工程的编译规则和各个文件之间的依赖关系。

makefile就像是一个shell脚本一样,其中可以执行操作系统的命令,它带来的好处就是我们能够实现“自动化编译”,一旦写好,只要一个make命令,整个软件功能就完全自动编译,提高了软件开发的效率。

make是一个命令工具,是一个解释makefile中指令的命令工具,一般来说大多数编译器都有这个命令,使用make可以是重新编译的次数达到最小化。

一、makefile的编写

makefile文件的规则可以非常复杂,比C程序还要复杂,我通过示例来介绍它的简单用法。

文件名:makefile,内容如下:

all:book1 book46 

book1:book1.c
gcc -o book1 book1.c

book46:book46.c _public.h _public.c
gcc -o book46 book46.c _public.c

clean:
rm -f book1 book46

第一行

all:book book46

all: 这是固定的写法。

book1 book46表示需要编译目标程序的清单,中间用空格分隔开,如果清单很长,可以用\换行。

第二行

makefile文件中的空行就像C程序中的空行一样,只是为了书写整洁,没有什么意义。

第三行

book1:book1.c

book1:表示需要编译的目标程序。

如果要编译目标程序book1,需要依赖源程序book1.c,当book1.c的内容发生了变化,执行make的时候就会重新编译book1。

第四行

gcc -o book1 book1.c

这是一个编译命令,和在操作系统命令行输入的命令一样,但是要注意一个问题,在gcc之前要用tab键,看上去像8个空格,实际不是,一定要用tab,空格不行。

第六行

book46:book46.c _public.h _public.c

与第三行的含义相同。

book46:表示编译的目标程序。

如果要编译目标程序book46,需要依赖源程序book46.c、_public.h和_public.c三个文件,只要任何一个的内容发生了变化,执行make的时候就会重新编译book46。

第七行

gcc -o book46 book46.c _public.c

与第四行的含义相同。

第九行

clean:

清除目标文件,清除的命令由第十行之后的脚本来执行。

第十行

rm  -f  book1 book46

清除目标文件的脚本命令,注意了,rm之前也是一个tab键,不是空格。

二、make命令

makefile准备好了,在命令提示符下执行make就可以编译makefile中all参数指定的目标文件。

程序make编译目标程序。

C语言makefile文件_目标文件

再执行一次make。

C语言makefile文件_c语言_02

因为全部的目标程序都是最新的,所以提示没有目标可以编译。

执行make clean,执行清除目标文件的指令。

C语言makefile文件_目标文件_03

再执行make重新编译。

C语言makefile文件_重新编译_04

修改_public.c程序,随便改点什么,只要改了就行。

然后再make

C语言makefile文件_c++_05

注意了,因为book46依赖的源程序之一_public.c改变了,所以book46重新编译。

book1没有重新编译,因为book1依赖的源文件并没有改变。

三、makefile文件中的变量

makefile中,变量就是一个名字,变量的值就是一个文本字符串。在makefile中的目标,依赖,命令或其他地方引用变量时,变量会被它的值替代。

我通过示例来介绍它的简单用法。

CC=gcc
FLAG=-g

all:book1 book46

book1:book1.c
$(CC) $(FLAG) -o book1 book1.c

book46:book46.c _public.h _public.c
$(CC) $(FLAG) -o book46 book46.c _public.c

clean:
rm -f book1 book46

第一行

CC=gcc

定义变量CC,赋值gcc。

第二行

FLAG=-g

定义变量FLAG,赋值-g。

第七行

$(CC)  $(FLAG) -o book1 book1.c

$(CC)和$(FLAG)就是使用变量CC和FLAG的值,类似于C语言的宏定义,替换后的结果是:

C语言makefile文件_重新编译_06

在makefile文件中,使用变量的好处有两个:1)如果在很多编译指令采用了变量,只要修改变量的值,就相当于修改全部的编译指令;2)把比较长的、公共的编译指令采用变量来表示,可以让makefile更简洁。

四、应用经验

makefile文件的编写可以很复杂,复杂到我不想看,在实际开发中,用不着那么复杂的makefile,我追求简单实用的方法,腾出更多的时间和精力去做更重要的事情,那些把makefile文件写得很复杂的程序员在我看来是吃饱了撑的。

五、课后作业

把您这段时间写的程序全部编写到makefile中,以后再也不要在命令提示符下用gcc了。

六、获取视频教程

七、版权声明

作者:码农有道

如果文章有错别字,或者内容有错误,或其他的建议和意见,请您留言指正,非常感谢!!!


标签:文件,book46,编译,make,makefile,C语言,book1,public
From: https://blog.51cto.com/u_13748800/5878572

相关文章

  • C语言数据类型
    文章目录​​一、基本类型​​​​1、字符型(char)​​​​2、整型(int)​​​​3、浮点型(float)​​​​二、字符串​​​​三、构造类型​​​​四、指针类型​​​​五、其它......
  • freecplus框架-加载参数文件
    文章目录​​一、源代码说明​​​​二、参数文件的意义​​​​三、CIniFile类​​​​1、类的声明​​​​2、示例程序​​​​四、获取视频教程​​​​五、版权声明​​......
  • freecplus框架-文件操作
    文章目录​​一、源代码说明​​​​二、文件操作函数​​​​1、删除文件​​​​2、文件重命名​​​​3、复制文件​​​​4、获取文件的大小​​​​5、获取文件的时间......
  • freecplus框架-日志文件操作
    文章目录​​一、源代码说明​​​​二、日志文件的意义​​​​三、CLogFile类​​​​1、类的声明​​​​2、示例程序​​​​3、日志文件的切换​​​​四、获取视频教......
  • C语言学习笔记---static关键字
    1、static修饰局部变量在函数体内,只初始化一次,被static声明过的局部变量在调用过程中值不变。原因:在任意函数内定义局部变量,存储在线程中的栈区,出函数时自动摧毁,所以在每......
  • c语言的钩子与C++的策略模式
    1.c语言钩子:特性模块:功能函数,调用注册函数主线模块:注册函数,定义钩子(通常是全局变量),调用钩子 2.c++策略模式:特性模块:从策略基类派生一个新特性类,实例化对象并调用se......
  • 这是注册博客的第一天,哈哈哈,我希望把我学到的编程内容记录下来,同时分享给和现在的我一
    #include<stdio.h>voidbubble_sort(intsz,intarr[])//不能只是intarr[],两个int间用逗号隔开{//先确定冒泡排序的趟数inti=0;for(i=0;i<sz-1;i++){intj=0;intflag=1......
  • 【linux基础(二)】Linux文件(目录)命名规则
    在Linux系统中,一切都是文件,既然是文件,就必须要有文件名。同其他系统相比,Linux操作系统对文件或目录命名的要求相对比较宽松。Linux系统中,文件和目录的命名规则如下:除......
  • go /golang 下生成protobuf *.pb.go文件 记录
      如果出现这个状况解决办法记录一下:在指定目录  gitclonehttps://github.com/golang/protobuf 下载源码   进入到以下目录  分别执行 以下图片......
  • 【C语言进阶】六.预处理
     (1)程序的翻译环境和执行环境在ANSIC的任何一种实现中,存在两个不同的环境。第1种是翻译环境,在这个环境中源代码被转换为可执行的机器指令。包含编译加链接第2种是执行环境,......