Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何编写Makefile来编译一个简单的C程序_C_Unix_Makefile - Fatal编程技术网

如何编写Makefile来编译一个简单的C程序

如何编写Makefile来编译一个简单的C程序,c,unix,makefile,C,Unix,Makefile,编译以下程序 #include <stdio.h> int main(void) { printf ("Hello from your first program!\n"); return 0; } #包括 内部主(空) { printf(“您的第一个程序的您好!\n”); 返回0; } a) -使用Makefile类型的文件 b) -可执行文件将命名为Hello “请帮我做一个练习。我知道如何在代码块中进行,但我不知道Makefile是什么,也不知道如何在Linux

编译以下程序

#include <stdio.h>
int main(void)
{
   printf ("Hello from your first program!\n");
   return 0;
}
#包括
内部主(空)
{
printf(“您的第一个程序的您好!\n”);
返回0;
}
a) -使用Makefile类型的文件

b) -可执行文件将命名为Hello


“请帮我做一个练习。我知道如何在代码块中进行,但我不知道Makefile是什么,也不知道如何在Linux中编写。我使用命令“gcc filename.c”编译了它,随后使用“/a.out”“但我还是不明白Makefile是什么。它是一种shell脚本,一种指令吗?这个任务的Makefile到底是什么样子的?提前感谢:)“

makefile是
make
实用程序的一个配方,用于说明如何使用shell运行的一组命令从其他文件(称为依赖项)创建一些文件(称为目标)。makefile通常如下所示:

target: dependency [...]
        command1
        command2
有关详细信息,请尝试运行
manmake

现在,对于您的任务来说,确实不需要Makefile,因为
make
具有内置的规则,知道如何编译一个简单的程序。您所需要做的就是将C源代码放在一个以可执行文件名(
Hello
)命名的文件中,并带有
.C
扩展名,即
Hello.C

然后是一个简单的

$ make Hello
cc     Hello.c   -o Hello
如果你想用gcc代替cc,你可以运行

$ rm Hello
$ make CC=gcc Hello
gcc     Hello.c   -o Hello

如果你告诉你的讲师/老师/教授,你只需要一个空的makefile,因为你知道内置的规则做正确的事情,你会得到一些额外的学分,也许你的讲师学到了一些新东西:-)如果你被要求提供参考,你可以引用make手册的相关部分,或者像专业人士一样,引用,第节默认规则

生成文件是计算机的一种配方,其中包含如何执行某些任务的说明以及这些任务之间的依赖关系

在简单的形式中,它看起来是这样的:

a.out: filename.c
        gcc filename.c
阅读:“要从
filename.c
生成
a.out
,请运行命令
gcc filename.c
。如果
a.out
filename.c
新,则不要执行任何操作“


注意:
gcc
中的第一个字符必须是制表符。

这是您为hello程序制作的简单文件

CC      = gcc
CFLAGS  = -g
RM      = rm -f


default: all

all: Hello

Hello: Hello.c
    $(CC) $(CFLAGS) -o Hello Hello.c

clean veryclean:
    $(RM) Hello
假设您在一个名为
makefile.m1
makefile.m2
的目录中有两个
makefile
,如果您想同时生成这两个make文件,请使用以下命令

make -f makefile.m1
make -f makefile.m2
或者使用包含以下内容的单个
Makefile

m1:
  make -f makefile.m1

m2:
  make -f makefile.m2
并使用
makem1
makem2

现在让我们澄清您对make文件名的疑问,make文件不能要求
Makefile

您可以随意命名makefile。假设我想命名为
myfirstmakefile.mk
。要稍后使用它,您需要告诉makefile您想要什么makefile。使用-f选项:

make -f myfirstmakefile.mk
同样,extantion
.mk
也不是管理性的,您可以使用任何您想要的,但永远不要忘记使用
-f
选项


因此,希望这对您有所帮助。

在使用makefile之前,您必须知道它是什么以及我们为什么需要它

什么是Makefile

Makefile是一个用特定语法编写的脚本,它有助于通过编译和链接从源文件构建目标输出(通常是一个或多个可执行文件)。简单地说,Makefile将以简单而快速的方式编译源代码。 为什么我们需要Makefile

=>大型项目可以包含多个源文件,这些源文件相互依赖或以分层方式排列。例如,要编译文件A,必须先编译文件B;要编译文件B,必须先编译文件C;等等

=>Make是这些问题的解决方案。它可以用来以良好的方式编译整个项目,并根据Make规则(我们将在后面讨论)通过输入单个命令Make生成目标

=>一个重要特性是,当一个项目在几次更改后重新编译时,它将只重新编译那些已更改的文件以及依赖它的任何其他文件。这节省了大量时间

=>对于一个大型项目,当对源代码进行一些更改时,每次手动重新编译整个项目都非常繁琐、容易出错且耗时


这里有一个很好的链接:

你尝试过谷歌搜索吗?你尝试过吗?出于某种原因,低级程序员确实参与了StackOverflow,但认为这不是一个提供好答案和教导不知道答案的人的好地方,而只是愤世嫉俗地提供链接或建议阅读手册页”_(ツ)_/’非常感谢。只是为了确保我做对了。首先,我使用nano和我的源代码创建了一个Hello.c,然后我保存并退出了它,在终端控制台(Linux/Unix)中键入(
make Hello
),然后在我的命令下得到了(
cc Hello.c-o Hello
)。所以我猜cc(用于编译c)和(-o是一个sth,如果链接将可执行输出放在文件输出中,那么它实际上是做什么的/用普通的话来说是什么意思(编译Hello.c并给出Makefile指令的空输出,但默认情况下?)。但是我运行了相同的命令(
makehello
),它给出了(
make:
Hello'是最新的。)
make
编译您的
Hello.c
文件,并根据文件名创建二进制文件。如果您再次发出
make
命令,它将查找您的
Hello.c
文件中的更改,如果未找到,则只需输出
Hello是最新的
@Zhivago当您再次运行make时,它将检查依赖关系是否更年轻han目标。如果是这样,它运行命令。如果不是这样,则无需执行任何操作,make会说“Hello是最新的”。它足够聪明,知道如果Hello.c没有更改,则无需编译它。这就是make的全部要点:做更新目标所需的最小工作。如果
触摸Hello.c
rm Hello