make: *** Нет правила для создания цели `main.c ', необходимой для main.o.Стоп - PullRequest
5 голосов
/ 19 января 2012

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;
}

Makefile

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 ]

8 голосов
/ 19 января 2012

Когда вы запускаете make, он пытается сделать первую цель в файле (exec), которая зависит от compile, которая зависит от main.o, которая зависит от main.c.Нет файла main.c, только SRC/main.c.Не существует правила для создания файла с именем main.c, и ранее не существует main.c, поэтому make имеет ошибку и завершает работу.

Вы можете исправить это с VPATH или vpath:

VPATH = SRC INCLUDE 
3 голосов
/ 19 января 2012

Ваш main.c находится в подкаталоге src, и make не знает, где его искать.Есть много опций, самый простой из которых - написать «src / main.c» вместо «main.c» в make-файле.Вы также можете переместить main.c на уровень выше, или переместить make-файл в src / и создать там, или поместить make-файл на верхний уровень, который cds в src, и вызовы, которые делают (это рекурсивное make, которое многие считают «вредным»но во многих (большинстве) случаях это прекрасно.) Вы также можете использовать директиву VPATH, но если вы решите это сделать, имейте в виду, что это не будет работать со всеми версиями make.

...