源内容(英文)
当我们在 C/C++ 中构建项目时,文件之间往往存在着依赖关系。例如,可能有一个文件 a.c 调用了 b.c 中的函数。因此,我们必须先编译 b.c,然后再编译 a.c。在一个项目中可能存在许多依赖关系,手动跟踪这些依赖并逐个编译文件会变得非常困难。在本文中,我们将探讨如何利用 make 工具来简化这一过程。首先,我们需要创建 4 个文件,其中包括 2 个 .c 文件,1 个头文件(.h)和 1 个 make 文件(.mk)。
让我们将文件命名为 client.c、server.c、server.h 和 makefile.mk。
Makefile 是一系列命令(类似于终端命令),包含变量名和目标(targets),用于创建目标文件(object file)以及清理它们。在一个 make 文件中,我们可以创建多个目标来编译和删除目标文件、二进制文件。通过使用 Makefile,你可以无数次地编译你的项目(程序)。该文件的主要思想是指定依赖关系。
make 工具: 这是一个命令行工具,用于处理 Makefile 中编写的指令。
让我们举一个简单的例子。client.c 文件包含主函数(main function),server.c 文件包含用户自定义的函数,
第三个文件是 server.h 头文件,它调用了 server.c 文件中的用户自定义函数,第四个文件是 makefile.mk,它包含了所有命令及其变量名。
这里我们编写 client.c 文件
C
CODEBLOCK_f45be391
这就是 client.c 文件,它包含两个头文件,一个是 #include"stdio.h",另一个是 #include"server.h",请记住这是我们最开始创建的同一个文件,它包含 main 函数,函数中有一条 printf 语句会输出 "hey there, welcome to"(不含引号),此外 main 函数还调用了另一个用户自定义函数 greetings()。
现在我们编写 server.c 文件
C
CODEBLOCK_39fc5953
在这个 server.c 中包含了两个头文件,一个是 #include"stdio.h",另一个是 #include"server.h",请记住这是我们最开始创建的同一个文件,它包含用户自定义的 greetings 函数,该函数中有一条 printf 语句会输出 "geeksforgeeks !"(不含引号)。
现在我们编写 server.h 文件
C
CODEBLOCK_75157222
这个 server.h 文件非常简单,它声明了在该文件中编写的函数,当我们把这个头文件包含到其他 c 程序中时,就可以使用这个头文件中定义的函数。这里,server.h 文件在被包含的地方都会包含这些函数。
现在我们编写 makefile.mk 文件
C
CODEBLOCK_d7b2e2b0
现在请仔细阅读,我将向你展示如何编写 makefile,
这里是在 Windows 环境下,所以目标文件是 "a",如果你使用的是 Linux,请将 "a" 替换为 "a.out"(不含引号)
看代码的第一行,其中的 "a" 代表目标文件,它包含了我们迄今为止编写的所有代码,在 "a" 之后还有两个目标文件:client.o 和 server.o,它们是生成目标文件 "a" 所需的文件。在下一行有一个 gcc 命令,请记住,在编写 gcc 命令之前必须有一个 Tab 缩进(如果你忘了加 Tab,程序将无法运行),gcc 命令会编译给定的文件并以目标文件的名称存储。
这很容易理解,就像这里一样,
target target_name : prerequisites
command with tab space
另一种记忆方式是
food: food items
making food
现在让我们看第三行,这里需要 client.o(因为它在代码的第一行中被使用),所以该文件的先决条件是 client.o 和 server.h 文件,gcc 命令将编译 client.c 以获得 client.o 文件。
最后我们需要的是 server.o 文件,要获得该文件我们需要 server.o 对象文件和 server.h 头文件。
gcc 编译器将编译 server.c 文件以获得 server.o 文件。
现在我们需要的一切都准备好了,makefile 代码到此完成。
现在让我们看看如何运行 make 文件。
> // This is used to run the makefile
> make -f makefile.mk
这是运行 makefile 的语法,输入此命令后按回车键,代码将进行编译,并会创建一个名为 "a"(在 Windows 中)或 "a.out"(在 Linux 中)的可执行文件。
现在执行文件的方法如下
> // Remember this