在makefile上遇到麻烦:它的行为不像我应该教的那样,而且我不确定该怎么做

时间:2019-11-17 18:46:04

标签: c makefile header-files

我正在为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中声明了extern 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.
}

1 个答案:

答案 0 :(得分:2)

  1. 可以通过将#include "complex.h"(由C保留,使用其他方式)放置在mandelbrot.h中来解决。

  2. 可以通过将#include "mandelbrot.h"放在mandelbrot.c内并从#include "complex.h"mandelbrot.c中删除main.c来解决。

  3. 可以通过将#include "complex.h"放在complex.c中来固定
  4. 可以通过将-o -Wall mandelbrot更改为-o mandelbrot -Wall来修复

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