Получение ошибки компиляции с makefile - PullRequest
2 голосов
/ 17 января 2012

Я попробовал следующий пример программы, чтобы понять использование make-файлов при компиляции.

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>
void factorial(int n)
{
 if(n!=1){
  return(n*factorial(n-1));
 }
 else
  return 1;
}

functions.h

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

makefile

exec : ./compile

compile : main.o hello.o factorial.o
  gcc -o compile

main.o : main.c functions.h
  gcc -c main.c

hello.o : hello.c functions.h
  gcc -c hello.c

factorial.o : factorial.c functions.h
  gcc -c factorial.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$ 

РЕДАКТИРОВАНИЕ:

gcc -c main.c
gcc -c hello.c
gcc -c factorial.c
gcc -o compile
gcc: no input files
make: *** [compile] Error 1

Пожалуйста, помогите мне понять, почему он выдает ошибку как functions.h не найден, поскольку я включил ее в свой make-файл.

Ответы [ 2 ]

3 голосов
/ 17 января 2012

Замените

#include<functions.h>

на

#include"functions.h"

Подробное объяснение здесь: http://www.geekinterview.com/question_details/3379

И, наконец, на этапе компоновки отсутствуют объектные файлы.

compile : main.o hello.o factorial.o
  gcc -o compile main.o hello.o factorial.o
1 голос
/ 17 января 2012

В качестве альтернативы смене источника вы можете включить текущий каталог для поиска в заголовочном файле, используя опцию -I в gcc.В этом случае ваше правило makefile, в котором вам нужен заголовочный файл, будет выглядеть следующим образом (при условии, что заголовочный файл является текущим каталогом):

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

Опять же, как уже указывалось, ошибка, с которой вы столкнулисьпозже во время связывания произошли пропущенные входные файлы в цели compile.Для этого снова есть альтернатива.Вы можете использовать $^ в make-файле для всех ваших зависимостей.В котором ваше compile правило будет выглядеть следующим образом:

compile:main.o hello.o factorial.o
    gcc -o compile $^

См. Эту ссылку для получения дополнительной информации о макросах make-файла.
Дополнительные примечания:

  1. Стражам не хватает вашего заголовочного файла
  2. Существует несоответствие в объявлении и определении функции factorial.
  3. Как уже упоминалось Джонатаном Леффлером, следует сообщить о прототипеprint_hello

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...