2014-12-12 3 views
2

Я только начал изучать make-файлы: я создал простой учебник самостоятельно, но кажется, что я где-то ошибаюсь, и я не знаю, где; мой мини-учебник сформирован сценарием main.c, который вызывает функцию с именем kernel.c; в этой последней функции вызывается еще 2 функции: add.c (что добавляет 2 числа вместе) и mul.c (что умножает результат предыдущей суммы); Затем я создал заголовки kernel.h и functions.h, которые содержат прототипы функций, определенных выше; это два заголовка содержится в папке, созданной в том же одном из main.c сценария: общих/вклMakefile для новичков

Вот файлы:

//main 
#include <stdio.h> 
#include <stdlib.h> 
#include "kernel.h" 

int main(){ 
int a = 5, b = 4, c = 0; 
int *pa, *pb, *pc; 
pa = &a; pb = &b; pc = &c; 

kernel(pa, pb, pc); 

printf("c = %d\n", c); 

return 0; 
} 

здесь kernel.c

#include "kernel.h" 
#include "functions.h" 

void kernel(int* a, int*b, int* c){ 
int x = add(*a,*b); 
*c = mul(x); 
} 

здесь add.c

#include "functions.h" 

int add(int a, int b){ 
return a + b; 
} 

здесь mul.c

#include "functions.h" 

int mul(int a){ 
return a*2; 
} 

здесь kernel.h

void kernel(int* a, int*b, int* c); 

здесь functions.h

int add(int a, int b); 
int mul(int a); 

Создание файла я написал, выглядит следующим образом:

#===========================Makefile================================# 

CC=gcc 
IDIR = common/inc 
CFLAGS=-c -Wall -I$(IDIR) 

all: eseguibile 

eseguibile: main.o 
    $(CC) $(CFLAGS) main.o -o eseguibile 

main.o: main.c kernel.o 
    $(CC) $(CFLAGS) main.c kernel.o 

kernel.o: kernel.c add.o mul.o 
    $(CC) $(CFLAGS) kernel.c add.o mul.o 

add.o: add.c 
    $(CC) $(CFLAGS) add.c 

mul.o: mul.c 
    $(CC) $(CFLAGS) mul.c 

clean: 
    rm -rf *o eseguibile 

Я знаю, p rogram работает, потому что, если я нахожу gcc main.c kernel.c add.c mul.c -I common/inc/ в терминале, все работает нормально. ?

Может кто-нибудь сказать мне, что я делание неправильно `

ошибка, что я получаю это:

gcc -c -Wall -Icommon/inc add.c 
gcc -c -Wall -Icommon/inc mul.c 
gcc -c -Wall -Icommon/inc kernel.c add.o mul.o 
gcc: warning: add.o: linker input file unused because linking not done 
gcc: warning: mul.o: linker input file unused because linking not done 
gcc -c -Wall -Icommon/inc main.c kernel.o 
gcc: warning: kernel.o: linker input file unused because linking not done 
gcc -c -Wall -Icommon/inc main.o -o eseguibile 
gcc: warning: main.o: linker input file unused because linking not done 
+0

с какой ошибкой вы сталкиваетесь? – Nico

+0

Используете ли вы вкладки или пробелы для отступов '$ (CC) $ (CFLAGS) ...'? Потому что 'make' * требует * вкладки. – RPGillespie

+0

да! я просто не мог реплицировать вкладки в stackoverflow, но в моем исходном make-файле были правильно сделаны вкладки –

ответ

5

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

#===========================Makefile================================# 

CC=gcc 
IDIR = common/inc 
CFLAGS=-Wall -I$(IDIR) 
OBJS = main.o kernel.o add.o mul.o 

all: eseguibile 

eseguibile: $(OBJS) 
    $(CC) $(CFLAGS) $^ -o eseguibile 

main.o: main.c kernel.h 
    $(CC) -c $(CFLAGS) main.c 

kernel.o: kernel.c kernel.h functions.h 
    $(CC) -c $(CFLAGS) kernel.c 

add.o: add.c functions.h 
    $(CC) -c $(CFLAGS) add.c 

mul.o: mul.c functions.h 
    $(CC) -c $(CFLAGS) mul.c 

clean: 
    rm -rf *.o eseguibile 
+0

Это сработало !!! Мне пришлось слегка изменить его, удалив kernel.h, который включен в общую папку/inc; кроме того, что он работает ... большое спасибо !! –

+2

Имейте в виду, что прямо сейчас цели ('main.o',' kernel.o' и т. Д.) Зависят только от одного файла, поэтому, если вы измените 'kernel.h', например, makefile выиграл ' Знать, какие цели нужно перестроить.Таким образом, вы можете добавить файлы '.h' в качестве зависимостей к целевым объектам, которые их используют. В противном случае вы обнаружите, что делаете «чистку»; сделать' много. – RPGillespie

+0

Да, хорошая точка! я буду помнить об этом –