make:***没有规则来制作目标`main.c',`main.o'需要。停止

时间:2012-01-19 12:53:52

标签: c unix gnu-make

functions.h

#include<stdio.h>
void print_hello(void);
int factorial(int n);

的main.c

#include<stdio.h>
#include<functions.h>
int main()
{
 print_hello();
 printf("\nThe factorial is: %d \n",factorial(5));
 return 0;
}

的hello.c

#include<stdio.h>
#include<functions.h>
void print_hello()
{
 printf("\nHello World!\n");
}

factorial.c

#include<stdio.h>
#include<functions.h>
int factorial(int n)
{
 if(n!=1)
 {
  return(n*factorial(n-1));
 }
 else
  return 1;
}

生成文件

exec : \
 compile  
    echo "Executing the object file"
    ./compile 

compile : main.o hello.o factorial.o
    echo "Compiling"
    gcc -o compile $^

main.o : main.c functions.h
    gcc -c main.c -I./INCLUDE -I./SRC

hello.o : hello.c functions.h
    gcc -c hello.c -I./INCLUDE -I./SRC

factorial.o : factorial.c functions.h
    gcc -c factorial.c -I./INCLUDE -I./SRC
  

文件夹:make_example \ INCLUDE \ functions.h文件夹:   make_example \ SRC \ main.c文件夹:make_example \ SRC \ hello.c文件夹:   make_example \ SRC \ factorial.c文件夹:make_example \ makefile

将make文件编译为“desktop:〜/ make_example $ make

时出错

make: * 没有规则可以制作目标main.c', needed by main.o'。停止“。

请帮我理解为什么会出现这个错误

2 个答案:

答案 0 :(得分:8)

当你运行make时,它会尝试在文件中创建第一个目标(exec),这取决于compile,这取决于main.o,这取决于main.c。没有文件main.c,只有SRC/main.c。没有规则可以创建名为main.c的文件,并且没有预先存在的main.c,因此make有错误并退出。

You can fix thisVPATHvpath

VPATH = SRC INCLUDE 

答案 1 :(得分:3)

你的main.c在子目录src中,并且make不知道在那里看。有很多选项,最简单的方法是在makefile中编写“src / main.c”而不是“main.c”。你也可以将main.c移动到一个级别,或者将makefile移动到src /并在那里构建,或者将一个makefile放入cds到src的toplevel中并调用make(这是递归make,很多人认为是“有害的”,但在很多(大多数)情况下完全没问题。)你也可以使用VPATH指令,但是如果你选择这样做,请注意这不适用于所有版本的make。