📜  如何使用make实用程序来构建C项目?

📅  最后修改于: 2021-05-28 04:07:28             🧑  作者: Mango

当我们使用C / C++构建项目时,文件之间存在依赖关系。例如,可能有一个文件ac从bc调用一个函数,因此我们必须在ac之前编译bc。项目中可能有很多依赖项,因此手动遵循这些依赖项并一步一步地编译文件变得很困难。在本文中,我们将了解make实用程序如何帮助我们简化这一过程。首先,我们需要创建4个文件,其中2个是.c文件,1个标头(.h)文件和1个make(.mk)文件。

让我们将文件命名为client.c和server.c以及server.h和makefile.mk
Makefile是具有可变名称和目标的一组命令(类似于终端命令),用于创建目标文件并将其删除。在一个make文件中,我们可以创建多个目标来编译和删除目标二进制文件。您可以使用Makefile多次编译您的项目(程序)。该文件的主要思想是指定依赖项。

make实用程序:这是一个命令行实用程序,用于处理Makefile中编写的指令。
让我们举一个简单的例子。 client.c文件包含主要函数,server.c文件包含用户定义的函数,
第三个文件是server.h头文件,它调用server.c文件中的用户定义的函数,而第四个文件是makefile.mk,其中包含所有命令集及其变量名。

在这里,我们编写client.c文件

C
// This is client.c file
#include "stdio.h"
 
// This is header file that we have created
// in the beginning.
#include "server.h"
int main()
{
    printf("hey there, welcome to ");
    greetings();
    return 0;
}


C
// This is server.c file
#include "server.h"
#include "stdio.h"
void greetings()
{
    printf("geeksforgeeks !");
}


C
// This is server.h file
void greetings();


C
// This is makefile.c file
a : client.o server.o gcc
        client.o server.o client.o : client.o server.h gcc
    - c client.c server.o : server.o server.h gcc
    - c server.c


这是client.c文件,其中包含两个头文件,一个是#include“ stdio.h”,另一个是#include“ server.h”文件,请记住,这是我们在开始时创建的同一文件,其中包含main函数包含printf语句,该语句打印为“嘿,欢迎光临”(不带引号),并且main函数还调用了另一个用户定义的函数greetings()。
现在我们编写server.c文件

C

// This is server.c file
#include "server.h"
#include "stdio.h"
void greetings()
{
    printf("geeksforgeeks !");
}

在这个包含两个头文件的server.c文件中,一个是#include” stdio.h”,另一个是#include” server.h”文件,请记住,这是我们在开始时创建的同一文件,其中包含用户定义的问候语函数,其中包含printf语句,该语句打印为“ geeksforgeeks!”。 (不带引号)。

现在我们编写server.h文件

C

// This is server.h file
void greetings();

这个server.h文件非常简单,它调用写在该文件中的函数,当我们将该头文件包含到其他c程序中时,我们就可以使用该头文件中定义的函数。无论在何处,此server.h文件都包含函数。

现在我们编写makefile.mk文件

C

// This is makefile.c file
a : client.o server.o gcc
        client.o server.o client.o : client.o server.h gcc
    - c client.c server.o : server.o server.h gcc
    - c server.c

现在在这里仔细阅读,我将向您展示如何编写makefile,

这在Windows中,因此如果您使用的是Linux,则目标文件为“ a”,则将“ a”替换为“ a.out” (不带引号)
请参见代码的第一行,其中“ a”代表目标文件,其中包含我们到目前为止编写的所有代码,在“ a”之后还有两个目标文件,分别是client.o和server.o。使目标文件成为“ a”所需的文件,在下一行中有gcc命令,请记住,在编写gcc命令之前,应该有1个制表符空间(如果忘记放置该程序的选项卡,它将无法运行), gcc命令编译提供给它的文件,并以其目标文件的名称存储。

就像这里一样容易理解,
目标target_name:先决条件
带制表符空间的命令

另一种记忆方式是
食品:食品
做饭

现在让我们移到第三行,这里需要client.o(因为这是在第一行代码中使用的),因此该文件的先决条件是client.o和server.h文件,gcc命令将编译客户端。 c获取client.o文件。
我们需要的最后一件事是server.o文件,获取该文件需要我们的server.o对象文件和server.h头文件
gcc编译器将编译server.c文件以获得server.o文件
现在我们需要的所有东西都准备好了,makefile代码现在已经完成了。

现在将看到如何运行make文件。

这是键入此命令后运行makefile的语法,按Enter键即可编译代码,并创建一个名为“ a”(在Windows中),“ a.out”(在Linux中)的可执行文件。

现在执行文件在这里

例子:

Output : hey there, welcome to geeksforgeeks

如何使实用程序在内部工作?它创建任务的依赖关系图,并使用拓扑排序算法查找遵循所有给定依赖关系的有效序列。

想要从精选的最佳视频中学习和练习问题,请查看《基础知识到高级C的C基础课程》。