C 使用makefile获取编译错误
我尝试了下面的示例程序来理解编译中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未找到,因为我已将其包含在生成文件中。替换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未找到,因为我已将其包含
#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
函数的声明和定义不匹配print\u hello
希望这有帮助 除了更改源之外,您还可以使用gcc选项包含当前目录以查找头文件。在这种情况下,需要头文件的
makefile
规则如下所示(假设头文件是当前目录):
正如前面所指出的,您在链接过程中遇到的错误是由于compile
目标中缺少输入文件造成的。对于这一点,还有其他选择。对于所有依赖项,您都可以使用makefile中的$^
。在其中,您将编译规则如下所示:
compile:main.o hello.o factorial.o
gcc -o compile $^
有关makefile宏的一些信息,请参见此部分。旁注:
factorial
函数的声明和定义不匹配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 $^