Makefile与自动推导CMake

本文介绍了Makefile的编写与Make的工作原理。通过一个简单的程序示例,展示了如何利用Makefile自动化编译过程,包括源文件依赖关系的分析和Make自动推导功能。同时,提到了CMake这一高级编译工具,它可以简化大型项目的配置,通过CMakeLists.txt文件生成Makefile。
摘要由CSDN通过智能技术生成

Makefile编写与Make工作原理

1.Makefile编写

我们知道,一个程序运行之前需要对程序中含有的文件先编译成中间代码文件,在Windows下也就是文件后缀为.obj的文件。在Linux下为.o文件(Linux下文件后缀是人为赋予的意义)。再进行链接,然后才能运行。但是,当一个程序需要很多文件时,我们在每一次需要运行时,都需要重新输入命令编译链接,这样做无疑很麻烦。于是便有了Makefile。当我们编写好Makefile后,只需要输入Make。就能实现程序的编译和链接。Makefile的编写,请看下面的实例。
demo.h文件

#include <stdio.h>

int text();

demo.c文件

#include "demo.h"

int text(){

    while(1){

          printf("Hello Makefile!\n");
          sleep(1);
    }

    return 0;
}

main.c文件

#include "demo.h"

int main(void){

    text();

    return 0;
}

Makefile文件

main.exe:main.o demo.o
        gcc -o main.exe main.o demo.o
main.o:main.c
        gcc -c main.c
demo.o:demo.c demo.h
        gcc -c demo.c
clean:
        rm main.exe main.o demo.o

编写好上面的文件与Makefile文件后输入make命令得到以下提示:在这里插入图片描述
输入make clean得到:在这里插入图片描述
从上面可以看出,Makefile类似于一种脚本文件按某种规则执行我们编写好的命令。那么它的规则是怎样的。

2.Make工作原理

首先我们先来分析一下各文件的依赖关系。
1.demo.h里包含了一个头文件与text的函数声明,demo.c文件包含了demo.h与text的函数定义。我们要将demo.h与demo.c编译成demo.o文件,所以demo.o依赖于demo.c与demo.h文件。
2.main.c要编译成main.o所以main.o依赖于main.c。
3.最终文件main.exe又依赖于main.o与demo.o。
根据这个依赖关系我们可以编写出Makefile文件。

那么当我们执行make时,脚本是如何运行的呢:
首先它会找到第一个文件,也就是main.exe。以这个文件作为最终生成的文件。然后找到它依赖的文件,demo.o和main.o文件。然后找到demo.o与main.o依赖的文件,根据依赖关系生成。最后再生成main.exe文件。从make执行的顺序也能知道。在这里插入图片描述
如果我们执行过一次make,又修改了某个文件,那么再次使用make进行编译时,make命令只会重新编译那些被修改过的文件再重新链接文件。比如我们修改demo.c文件。
demo.c

#include "demo.h"

int text(){

    while(1){

          printf("Hello Linux!");
          printf("Hello Makefile!\n");
          sleep(1);
    }

    return 0;
}

执行make后:
在这里插入图片描述
另外如果一个工程的头文件被改变了,那么我们需要编译引用了这几个头文件的C文件,并链接目标程序。

Make自动推导与Make变量

1.Make自动推导

Make具有自动推导功能,当有一个*.o文件时,在它的依赖关系中会自动加入同名的.c文件。并且自动推导出gcc -c *.c。看一个例子。
还是之前的代码。demo.o会被自动推导出demo.c与gcc -c demo.c所以可以省略demo.c与gcc -c demo.c。main.o会自动推导出main.c与gcc -c main.c所以可以省略main.c与gcc -c main.c。所以我们的Makefile可以写成

main.exe:main.o demo.o
        gcc -o main.exe main.o demo.o
main.o:
#       gcc -c main.c
demo.o:demo.h
#       gcc -c demo.c
clean:
        rm main.exe main.o demo.o

(#号后的为注释)
执行Make后为在这里插入图片描述

2.Make变量

在复杂的工程中,Makefile可能很复杂,当我们需要修改了一个文件时,可能在Makefile中需要修改的地方就有很多。但Make变量能帮助解决这个问题。Make变量类似于C语言中的宏定义。可以把某一字符串替换成另一个。
它的用法是:变量定义: 变量名 = 值 ##使用shell script 的语法
举个例子:
还是之前的代码,我们把main.o demo.o 替换成object。重写的Makefile为:

object=main.o demo.o
main.exe:$(object)
        gcc -o main.exe $(object)
main.o:main.c
        gcc -c main.c
demo.o:demo.c demo.h
        gcc -c demo.c
clean:
        rm main.exe main.o demo.o

执行Make为:
在这里插入图片描述
是一样的效果。

人生苦短,我用CMake。

CMake是一个高度自动化的编译工具。使用时只要配置CMakeLists.txt文件,再输入命令就可以自动生成Makefile文件。
使用之前需要安装CMake。使用命令sudo apt-get install cmake。

在 linux 平台下使用 CMake 生成 Makefile 并编译的流程如下:

1.编写 CMake 配置文件 CMakeLists.txt 。
2.执行命令 cmake PATH 生成 Makefile。其中, PATH 是 CMakeLists.txt 所在的目录。
3.使用 make 命令进行编译。

配置CMakeLists.txt 文件的格式为:

#CMake 最低版本要求
cmake_minimum_required(VERSION 2.8)

#项目信息
project(main.exe)

#指定生成的目标
add_executable(main.exe main.c demo.c)
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值