Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/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
C 使用Makefile链接多个文件_C_Makefile - Fatal编程技术网

C 使用Makefile链接多个文件

C 使用Makefile链接多个文件,c,makefile,C,Makefile,我在Makefile业务中迷失了方向,我正在努力适应它。我希望有人能把我目前正在编程的一个例子讲清楚 我有以下文件: my-bit-vector.h -> a header file included in eratost.c, ppm.c ppm.c -> a .c file which includes my-bit-vector.h and error.h error.h -> a header file included in eratost.c, ppm.c erro

我在Makefile业务中迷失了方向,我正在努力适应它。我希望有人能把我目前正在编程的一个例子讲清楚

我有以下文件:

my-bit-vector.h -> a header file included in eratost.c, ppm.c
ppm.c -> a .c file which includes my-bit-vector.h and error.h
error.h -> a header file included in eratost.c, ppm.c
error.c -> a .c file which includes error.h and defines the functions in it
erato.c -> a .c file which includes my-bit-vector.h and error.h
我需要将这些链接到一个可执行文件中。我将如何通过Makefile实现这一点?我希望我没有忘记什么。你能帮忙吗

program: ppm.o error.o erato.o
    gcc ppm.o error.o erato.o -o program
ppm.o: ppm.c
    gcc -c ppm.c -o ppm.o
error.o: error.c
    gcc -c error.c -o error.o
erato.o: erato.c
    gcc -c erato.c -o erato.o
之前的东西:是目标。后面的内容:是此目标的必需目标。 所以,如果你让程序make正在寻找一个名为all的目标。目标all需要ppm.o,它也在makefile中定义为target。所以它首先执行这个目标。目标ppm.o需要ppm.c,它在makefile中没有定义目标,因此它可能是一个文件。我希望这能向您解释基本功能。 对于初学者来说,这是一个非常好的教程,有一些基本的makefile示例

之前的东西:是目标。后面的内容:是此目标的必需目标。 所以,如果你让程序make正在寻找一个名为all的目标。目标all需要ppm.o,它也在makefile中定义为target。所以它首先执行这个目标。目标ppm.o需要ppm.c,它在makefile中没有定义目标,因此它可能是一个文件。我希望这能向您解释基本功能。
对于初学者来说,这是一个非常好的教程,有一些基本的makefile示例。

简单来说,makefile的内容是一个或多个目标,即您想要构建的内容。每个目标都有依赖项如果依赖项不存在,则必须构建它们;如果依赖项确实存在,但比目标更新,则必须重建目标,并根据依赖项规则命令来构建目标

在您的情况下,让我们假设您的最终输出是一个名为program的程序。您已经确定了构建它的源代码,但是您不是直接从源代码构建可执行文件,而是从对象文件构建。您可以这样启动makefile:

program: ppm.o error.o erato.o
        cc -o program ppm.o error.o erato.o
警告规则行上的间距上面显示的cc命令行需要一个选项卡,而不仅仅是空格

这就足够开始了,但还不够正确。您会注意到,.o的还没有目标:依赖项/规则,但它仍然有效,因为Make有一些内置规则

有了这个makefile,如果您键入make两次,第一次您将看到所有内容都已生成,第二次它将不会发生任何更改,因此不需要重新生成。不幸的是,如果您现在编辑.h,则.c仍无法重建,因此让我们修复此问题:

program: ppm.o error.o erato.o
        cc -o program ppm.o error.o erato.o

ppm.o: ppm.c my-bit-vector.h error.h

error.o: error.c error.h

erato.o: erato.c my-bit-vector.h error.h 
现在,您已经将依赖项设置为使make重新生成在标头更改时必须重新生成的源。这些源构建上没有规则,因为这里的内置规则通常就足够了。当然,如果需要,您可以覆盖内置的

在这里,当您键入make时,该工具将找到第一个目标程序并检查其依赖关系。然后,它将根据其目标(依赖项/规则定义)递归地确保其每个依赖项都是最新的,只要有需要构建的目标。最后,它将应用此目标的规则来完成其构建


makefiles还有很多事情可以做,这只是一个简短的介绍。

简单来说,Makefile的内容是一个或多个目标,即您想要构建的内容。每个目标都有依赖项如果依赖项不存在,则必须构建它们;如果依赖项确实存在,但比目标更新,则必须重建目标,并根据依赖项规则命令来构建目标

在您的情况下,让我们假设您的最终输出是一个名为program的程序。您已经确定了构建它的源代码,但是您不是直接从源代码构建可执行文件,而是从对象文件构建。您可以这样启动makefile:

program: ppm.o error.o erato.o
        cc -o program ppm.o error.o erato.o
警告规则行上的间距上面显示的cc命令行需要一个选项卡,而不仅仅是空格

这就足够开始了,但还不够正确。您会注意到,.o的还没有目标:依赖项/规则,但它仍然有效,因为Make有一些内置规则

有了这个makefile,如果您键入make两次,第一次您将看到所有内容都已生成,第二次它将不会发生任何更改,因此不需要重新生成。不幸的是,如果您现在编辑.h,则.c仍无法重建,因此让我们修复此问题:

program: ppm.o error.o erato.o
        cc -o program ppm.o error.o erato.o

ppm.o: ppm.c my-bit-vector.h error.h

error.o: error.c error.h

erato.o: erato.c my-bit-vector.h error.h 
现在,您已经将依赖项设置为使make重新生成在标头更改时必须重新生成的源。这些源构建上没有规则,因为这里的内置规则通常就足够了。当然,如果需要,您可以覆盖内置的

在这里,当您键入make时,该工具将找到第一个目标程序并检查其依赖关系。然后,它将根据其目标(依赖项/规则定义)递归地确保其每个依赖项都是最新的,只要有需要考虑的目标 我为正在建造的建筑感到高兴。最后,它将应用此目标的规则来完成其构建


makefiles还可以做更多的工作,这只是一个简短的介绍。

哪一个包括您的主要功能?所有这些文件都在一个目录中吗?@patrickvacek为什么包含main的源文件会起作用?main在ppm.c中,这些文件都在一起。@mah,也许有点小,但有几个原因。大多数情况下,我想确保确实只有一个主函数,但这对于命名也可能很重要。哪一个包含您的主函数?所有这些文件都在一个目录中吗?@patrickvacek为什么包含main的源文件会起作用?main在ppm.c中,这些文件都在一起。@mah,也许有点小,但有几个原因。大多数情况下,我想确保确实只有一个主函数,但这也可能与命名目的有关。在这样一个简单的makefile中,最好重命名初始目标程序,而不是全部。这样,如果make看到程序已经存在并且不比它的任何直接或间接依赖项旧,make就知道它不必重新编译程序。一个合理的中间立场是将all:program添加为目标/依赖项,以允许在不重建任何不需要重建的内容的情况下进行额外的顶级构建。在这样一个简单的makefile中,最好重命名初始目标程序而不是all。这样,如果make看到程序已经存在并且不比它的任何直接或间接依赖项旧,make就知道它不必重新编译程序。一个合理的中间立场是将all:program添加为目标/依赖项,以允许在不重建任何不需要重建的内容的情况下进行额外的顶级构建。