我正在为C课堂教学项目。该想法是使用在不同源文件中设置的函数并使用标头和makefile链接在一起的功能来创建mandelbrot集的可视化。我可以确认complex.c(如下)的100%正常工作,并且在编译时没有警告或错误。但是,对于这个项目,我已经将类型定义移到了头文件中,并且在main.c文件中有一个“虚构”类型的全局变量。该全局变量由我的mandelbrot.h头文件引用。

尝试使用我的makefile进行编译时,出现两个错误。这些错误是:

1. "error: unknown type name "img""


这是在我移动了“ typedef struct {} img;”之后发生的到头文件。

2. Undeclared variable c referenced for first time at line <whatever> in mandelbrot.c


我在main.c中声明了img c,在mandelbrot.h中声明了外部img c。我不知道这是怎么回事,因为我们的教授明确地说要在main.c中将变量声明为global,然后在mandelbrot.h中通过extern引用它,以便可以在mandelbrot.c中看到它。

我试图明确,因为如果我做错了事,我想跟踪并找到它(加上我们应该使用明确的makefile,而不要使用特殊变量,例如$(CC)等。最终的可执行文件是mandelbrot 。

mandelbrot: main.o mandelbrot.o complex.o
    gcc -o -Wall mandelbrot main.o mandelbrot.o complex.o

main.o: main.c complex.h mandelbrot.h
    gcc -c main.c

mandelbrot.o: mandelbrot.c complex.h mandelbrot.h
    gcc -c mandelbrot.c

complex.o: complex.h complex.c
    gcc -c complex.c -lm

clean:
    rm *.o


这是我的源代码(所有标头也包括我的函数原型,但我没有复制它们):

//complex.h
//Components of complex number.
typedef struct{
    float r;
    float j;
} img;


这是源文件:

//complex.c
#include <stdio.h>
#include <math.h>

img function(c){
//does something with the global variable c
}


我有第二个功能,它正在处理涉及mandelbrot集的一些检查。该函数位于单独的文件中,并具有:

//mandelbrot.h
//Reference an external global variable.
extern img c;


和源文件:

//mandelbrot.c
#include "complex.h"
img mandelbrot(int n){
    //Code that does stuff
    if (absolute_value(c, n-1) > 1000000){
    //does something
    }
}


我有最后一个源文件:

//main.c
#include "mandelbrot.h"
#include "complex.h"
img c;

main(){
    //does some stuff.
}

最佳答案

可以通过将#include "complex.h"(C保留,使用其他方式)放在mandelbrot.h中来修复。
可以通过将#include "mandelbrot.h"放在mandelbrot.c内并从#include "complex.h"mandelbrot.c中删除​​main.c来修复。
可以通过将#include "complex.h"放在complex.c中进行修复。
可以通过将-o -Wall mandelbrot更改为-o mandelbrot -Wall来修复。


您确实需要开始使用标题防护。

关于c - 在makefile上遇到麻烦:它的行为不像我应该教的那样,而且我不确定该怎么做,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58903948/

10-13 08:41