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
C 使用makefile获取编译错误_C_Unix - Fatal编程技术网

C 使用makefile获取编译错误

C 使用makefile获取编译错误,c,unix,C,Unix,我尝试了下面的示例程序来理解编译中makefiles的用法 main.c 错误: cheetah@desktop:~/make_example$ make compile gcc -c main.c main.c:2:22: error: functions.h: No such file or directory make: *** [main.o] Error 1 cheetah@desktop:~/make_example$ 请帮助我理解为什么它作为函数抛出错误。h未找到,因为我已将其包含

我尝试了下面的示例程序来理解编译中makefiles的用法

main.c 错误:

cheetah@desktop:~/make_example$ make compile gcc -c main.c main.c:2:22: error: functions.h: No such file or directory make: *** [main.o] Error 1 cheetah@desktop:~/make_example$ 请帮助我理解为什么它作为函数抛出错误。h未找到,因为我已将其包含在生成文件中。

替换

#include<functions.h>
详细说明如下:

最后,对象文件在链接阶段丢失

compile : main.o hello.o factorial.o
  gcc -o compile main.o hello.o factorial.o
替换

#include<functions.h>
详细说明如下:

最后,对象文件在链接阶段丢失

compile : main.o hello.o factorial.o
  gcc -o compile main.o hello.o factorial.o

除了更改源之外,还可以使用gcc选项包含当前目录以查找头文件。在这种情况下,需要头文件的
makefile
规则如下所示(假设头文件是当前目录):

正如前面所指出的,您在链接过程中遇到的错误是由于
compile
目标中缺少输入文件造成的。对于这一点,还有其他选择。对于所有依赖项,您都可以使用makefile中的
$^
。在其中,您将编译规则如下所示:

compile:main.o hello.o factorial.o
    gcc -o compile $^
有关makefile宏的一些信息,请参见此部分。
旁注:

  • 缺少您的头文件
  • factorial
    函数的声明和定义不匹配
  • 正如Jonathan Leffler已经提到的,我们将向您推荐
    print\u hello

  • 希望这有帮助

    除了更改源之外,您还可以使用gcc选项包含当前目录以查找头文件。在这种情况下,需要头文件的
    makefile
    规则如下所示(假设头文件是当前目录):

    正如前面所指出的,您在链接过程中遇到的错误是由于
    compile
    目标中缺少输入文件造成的。对于这一点,还有其他选择。对于所有依赖项,您都可以使用makefile中的
    $^
    。在其中,您将编译规则如下所示:

    compile:main.o hello.o factorial.o
        gcc -o compile $^
    
    有关makefile宏的一些信息,请参见此部分。
    旁注:

  • 缺少您的头文件
  • factorial
    函数的声明和定义不匹配
  • 正如Jonathan Leffler已经提到的,我们将向您推荐
    print\u hello

  • 希望这有帮助

    如果我没有看错的话,那篇文章只解释了两种风格的包含搜索位置的顺序不同。这是否解释了为什么第一个函数没有找到
    functions.h
    ,假设它位于当前目录中?谢谢。现在,由于没有i/p文件,我遇到了错误。。不知道我遗漏了什么,为什么从makefile中删除functions.h?它应该在构建对象文件的依赖项列表中。@DanFego,因为我想,
    functions.h
    不在默认搜索位置。通常,命名的默认搜索位置通常是您的标准system include目录。@shinkou如果您在标题中定义一个结构,然后在某个时候更改其定义,使其占用更多/更少的空间,该怎么办。如果对象文件依赖于正确的头文件,则会根据需要重新编译所有文件。如果他们不这样做,并且您更改了一些源文件,包括更改的头文件,而不是其他文件,则只有更改的文件才会重新编译,从而导致损坏。如果我阅读正确,那篇文章只解释了两种样式的包含搜索位置的顺序不同。这是否解释了为什么第一个函数没有找到
    functions.h
    ,假设它位于当前目录中?谢谢。现在,由于没有i/p文件,我遇到了错误。。不知道我遗漏了什么,为什么从makefile中删除functions.h?它应该在构建对象文件的依赖项列表中。@DanFego,因为我想,
    functions.h
    不在默认搜索位置。通常,命名的默认搜索位置通常是您的标准system include目录。@shinkou如果您在标题中定义一个结构,然后在某个时候更改其定义,使其占用更多/更少的空间,该怎么办。如果对象文件依赖于正确的头文件,则会根据需要重新编译所有文件。如果他们不这样做,并且您更改了一些源文件(包括更改的头文件,但不更改其他头文件),则只有更改的文件才会重新编译,从而导致损坏。请注意,
    functions.h
    没有提供
    print_hello()
    的原型;它只是将函数声明为接受不确定(但固定)数量的参数。要成为C语言中的原型,您必须给出
    void print\u hello(void)(虽然在C++中,这将是不同的)。注意<代码>函数。h < /> >不给出原型<代码> PrtTyHelLoor()/<代码>;它只是将函数声明为接受不确定(但固定)数量的参数。要成为C语言中的原型,您必须给出
    void print\u hello(void)(虽然在C++中,这将是不同的)。
    
    #include<functions.h>
    
    #include"functions.h"
    
    compile : main.o hello.o factorial.o
      gcc -o compile main.o hello.o factorial.o
    
    main.o : main.c functions.h
      gcc -c main.c -I./
    
    compile:main.o hello.o factorial.o
        gcc -o compile $^